1 #if( BUILD_SBM_FAST != 1)
2 MODULE module_mp_fast_sbm
7 END SUBROUTINE SBM_fast
8 END MODULE module_mp_fast_sbm
11 module module_mp_SBM_BreakUp
12 end module module_mp_SBM_BreakUp
14 module module_mp_SBM_Collision
15 end module module_mp_SBM_Collision
17 module module_mp_SBM_Auxiliary
18 end module module_mp_SBM_Auxiliary
20 module module_mp_SBM_Nucleation
21 end module module_mp_SBM_Nucleation
24 ! +-----------------------------------------------------------------------------+
25 ! +-----------------------------------------------------------------------------+
27 ! This is the spectral-bin microphysics scheme based on the Hebrew University
28 ! Cloud Model (HUCM), originally formulated and coded by Alexander Khain
29 ! (email: Alexander.Khain@mail.huji.ac.il);
30 ! The WRF bin microphysics scheme (Fast SBM or FSBM) solves equations for four
31 ! size distribution functions: aerosols, drop (including rain drops), snow and
32 ! graupel/hail (from which mass mixing ratio qna, qc, qr, qs, qg/qh and
33 ! their number concentrations are calculated).
35 ! The scheme is generally written in CGS units. In the updated scheme (FSBM-2)
36 ! the users can choose either graupel or hail to describe dense particles
37 ! (see the 'hail_opt' switch). By default, the 'hail_opt = 1' is used.
38 ! Hail particles have larger terminal velocity than graupel per mass bin.
39 ! 'hail_opt' is recommended to be used in simulations of continental cloud
40 ! systems. The Graupel option may lead to better results in simulations of
41 ! maritime convection.
43 ! The aerosol spectrum in FSBM-2 is approximated by 3-lognormal size distribution
44 ! representing smallest aerosols (nucleation mode), intermediate-size
45 ! (accumulation mode) and largest aerosols (coarse mode). The BC/IC for aerosols
46 ! ,as well as aerosols vertical distribution profile -- are set from within the
47 ! FSBM scheme (see the 'DX_BOUND' parameter). The flag to enable the lognormal
48 ! aerosols is (ILogNormal_modes_Aerosol = 1, manadatory flag). The modes parameters
49 ! (concentration, mean radius and model width) are defined inside the routine
50 ! "LogNormal_modes_Aerosol".
51 ! **NOTE**: In order to set aerosol BC for the outer-most domain, set the threshold
52 ! 'DX_BOUND' = 'MY_DX_OUTER_DOMAIN'-1. For example, if the outermost domain
53 ! resolutionis is 4km 'DX_BOUND' = 3999.
56 ! The user can set the liquid water content threshold (LWC) in which rimed snow
57 ! is being transferred to hail/graupel (see 'ALCR' parameter).
58 ! The default value is ALCR = 0.5 [g/m3]. Increasing this value will result
59 ! in an increase of snow mass content, and a decrease in hail/graupel mass
62 ! We thank and acknowledge contribution from Jiwen Fan (PNNL), Alexander Rhyzkov
63 ! (CIMMS/NSSL), Jeffery Snyder (CIMMS/NSSL), Jimy Dudhia (NCAR) and Dave Gill
66 ! The previous WRF FSBM version (FSBM-1) was coded by Barry Lynn (email:
67 ! Barry.H.Lynn@gmail.com); This updated WRF SBM version (FSBM-2) was coded and
68 ! is maintained by Jacob Shpund (email: kobby.shpund@mail.huji.ac.il).
69 ! Please feel free to reachout with questions about the scheme.
73 ! Khain, A. P., and I. Sednev, 1996: Simulation of precipitation formation in
74 ! the Eastern Mediterranean coastal zone using a spectral microphysics cloud
75 ! ensemble model. Atmospheric Research, 43: 77-110;
76 ! Khain, A. P., A. Pokrovsky and M. Pinsky, A. Seifert, and V. Phillips, 2004:
77 ! Effects of atmospheric aerosols on deep convective clouds as seen from
78 ! simulations using a spectral microphysics mixed-phase cumulus cloud model
79 ! Part 1: Model description. J. Atmos. Sci 61, 2963-2982);
80 ! Khain A. P. and M. Pinsky, 2018: Physical Processes in Clouds and Cloud
81 ! modeling. Cambridge University Press. 642 pp
82 ! Shpund, J., A. Khain, and D. Rosenfeld, 2019: Effects of Sea Spray on the
83 ! Dynamics and Microphysics of an Idealized Tropical Cyclone. J. Atmos. Sci., 0,
84 ! https://doi.org/10.1175/JAS-D-18-0270.1 (A preliminary description of the
85 ! updated FSBM-2 scheme)
87 ! When using the FSBM-2 version please cite:
88 ! -------------------------------------------
89 ! Shpund, J., Khain, A., Lynn, B., Fan, J., Han, B., Ryzhkov, A., Snyder, J.,
90 ! Dudhia, J. and Gill, D., 2019. Simulating a Mesoscale Convective System Using WRF
91 ! With a New Spectral Bin Microphysics: 1: Hail vs Graupel.
92 ! Journal of Geophysical Research: Atmospheres.
94 ! +---------------------------------------------------------------------------- +
95 ! +-----------------------------------------------------------------------------+
96 module module_mp_SBM_BreakUp
99 public Spont_Rain_BreakUp,Spontanous_Init,BreakUp_Snow,KR_SNOW_MIN,KR_SNOW_MAX
102 INTEGER, PARAMETER, PRIVATE:: R8SIZE = 8
103 INTEGER, PARAMETER, PRIVATE:: R4SIZE = 4
105 ! ... Spontanous Rain BreakUp
106 INTEGER,PARAMETER :: JBreak_Spontanous = 28, &
108 DOUBLE PRECISION,PARAMETER :: COL = 0.23105
110 INTEGER,PARAMETER :: KR_SNOW_MAX = 35
111 INTEGER,PARAMETER :: KR_SNOW_MIN = 34
112 ! ... Snow breakup probability
113 DOUBLE PRECISION,PARAMETER :: BREAK_SNOW_KRMAX_0 = 0.02D0
114 DOUBLE PRECISION,PARAMETER :: BREAK_SNOW_KRMAX_1 = 0.012D0
115 !DOUBLE PRECISION,PARAMETER :: BREAK_SNOW_KRMAX_2 = 0.08D0
116 !DOUBLE PRECISION,PARAMETER :: BREAK_SNOW_KRMAX_3 = 0.04D0
119 ! +--------------------------------------------------------------------------+
120 subroutine Spontanous_Init(DTwrf, XL, DROPRADII, Prob, Gain_Var_New, NND, NKR, &
125 integer,intent(in):: NKR
126 real(kind=r4size),intent(in) :: DTwrf,XL(:),DROPRADII(:)
127 real(kind=r8size),intent(out) :: Prob(:), Gain_Var_New(:,:), NND(:,:)
130 real(kind=r8size) :: diameter(nkr), ratio_new, q_m, gain_var(nkr,nkr), dtime_spon_break, &
131 DROPRADII_dp(nkr),XL_dp(nkr)
132 integer :: kr,i,j, ikr_spon_break
133 real(kind=r8size),parameter :: gamma = 0.453d0
134 character*256 :: wrf_err_message
137 !dtime_spon_break = DTwrf
138 DROPRADII_dp = DROPRADII
141 diameter(:) = DROPRADII_dp(:)*2.0d0*10.0d0
145 IF (DROPRADII(kr)>=0.3) exit
148 WRITE( wrf_err_message , * ) 'IKR_Spon_Break=',ikr_spon_break
149 CALL wrf_message ( TRIM ( wrf_err_message ) )
151 if (i_break_method==1) then
153 prob(kr)=2.94d-7*dexp(34.0d0*DROPRADII(kr))
155 else if (i_break_method==2) then
157 prob(kr)=0.155d-3*dexp(1.466d0*10.0d0*DROPRADII(kr))
162 ! prob(kr)=2.94d-7*dexp(34.0d0*DROPRADII_dp(kr))*dtime_spon_break
163 ! IF (prob(kr)>=1.0d0) exit
166 DO j=ikr_spon_break,nkr
168 gain_var(j,i)=(145.37d0/xl_dp(i))*(dropradii_dp(i)/dropradii_dp(j))*dexp(-7.0d0*dropradii_dp(i)/dropradii_dp(j))
169 !gain_var_new(j,i)=gain_var(j,i)*xl(j)/(gain_var(j,i)*xl(i)**2.0d0)
170 nnd(j,i)=gamma*dexp(-gamma*diameter(i))/(1-dexp(-gamma*diameter(j)))
173 ! Calculation the ratio that leads to mass conservation
175 DO i=1,ikr_spon_break-1
176 !nnd_m = nnd_m+nnd(ikr_spon_break,i)*m(i);
177 q_m = q_m + gain_var(ikr_spon_break,i)*xl_dp(i)**2;
179 ratio_new = q_m/xl_dp(ikr_spon_break)
180 ! print*, 'ikr_spon_break,q_m,xl(ikr_spon_break),ratio_new'
181 ! print*, ikr_spon_break,q_m,xl(ikr_spon_break),ratio_new
182 DO j=ikr_spon_break,nkr
184 gain_var_new(j,i) = gain_var(j,i)/ratio_new
189 End Subroutine Spontanous_Init
190 ! +-----------------------------------------------------------------------------+
191 ! i_break_method=1: Spontaneous breakup according to Srivastava1971_JAS -
192 ! Size distribution od raindrops generated by their breakup and coalescence
193 ! i_break_method=2: Spontaneous breakup according to Kamra et al 1991 JGR -
194 ! SPONTANEOUS BREAKUP OF CHARGED AND UNCHARGED WATER DROPS FREELY SUSPENDED IN A WIND TUNNEL
195 ! Eyal's new changes (29/3/15) (start)
196 ! Description of variables (start)
197 ! FF1R(KR), 1/g/cm3 - non conservative drop size distribution
198 ! XL(kr), g - Mass of liquid drops
199 ! prob, dimensionless - probability for breakup
200 ! dropconc_bf(kr), cm^-3 - drops concentration before breakup
201 ! dropconc_af(kr), cm^-3 - drops concentration before breakup
202 ! drops_break(kr), cm^-3 - concentration of breaking drops
203 ! Description of variables (end)
205 SUBROUTINE Spont_Rain_BreakUp (DTwrf, FF1R, XL, Prob, Gain_Var_New, NND, NKR, ikr_spon_break)
209 integer,intent(in) :: NKR, IKR_Spon_Break
210 real(kind=r8size),intent(INOUT) :: FF1R(:)
211 real(kind=r8size),intent(IN) ::XL(:),Prob(:),Gain_Var_New(:,:),NND(:,:)
212 real(kind=r4size),intent(in) :: DTwrf
215 real(kind=r8size) :: dm, deg01, tmp_1, tmp_2, tmp_3
216 real(kind=r8size),dimension(nkr) :: dropconc_bf, dropconc_af, drops_break, psi1, dropradii
217 integer :: kr,i,imax,j
218 real(kind=r4size) :: start_time, end_time, dtime_spon_break
221 dtime_spon_break = DTwrf
225 DROPRADII(KR)=(3.*XL(KR)/4./3.141593/1.)**DEG01
228 if(SUM(FF1R) <= nkr*1.D-30) return
233 if (FF1R(i) > 0.0D0) exit
236 if (imax<ikr_spon_break) return
238 ! Initialization (start)
243 ! b) Calculation of concentration of raindrops in all bins
246 dropconc_bf(kr)=dropconc_bf(kr)+dm*psi1(kr)
248 dropconc_af(:)=dropconc_bf(:)
250 ! c+d) Calculation of number of breaking drops and the concentration of drops remaining in particular bin
252 do kr=imax,ikr_spon_break,-1
253 !dropconc_af(kr)=dropconc_bf(kr)/(1+prob(kr)*dtime_spon_break)
254 tmp_1 = prob(kr)*dtime_spon_break ! [KS, 18thJan18] >> the time was added here and not in the initialization
256 tmp_3 = dropconc_bf(kr)
257 dropconc_af(kr) = tmp_2*tmp_3
258 !dropconc_af(kr) = dexp(-dtime_spon_break*prob(kr))*dropconc_bf(kr)
259 drops_break(kr) = dropconc_bf(kr)-dropconc_af(kr)
260 !if (dropconc_af(kr)<0.0d0) stop 'Spontaneous breakup'
263 ! e) Recalculation of DSD in bin j using new concentration
264 ! do kr=ikr_spon_break,imax
265 ! dm=3.0D0*col*xl(kr)
266 ! psi1(kr)=psi1(kr)-drops_break(kr)/dm
269 ! f+g) Redistributing and calculations drops concentration over smaller (i<j) bins
271 select case (i_break_method)
273 do j=ikr_spon_break,imax
275 dropconc_af(i)=dropconc_af(i)+drops_break(j)*gain_var_new(j,i)*xl(i)
280 do j=ikr_spon_break,imax
282 dropconc_af(i)=dropconc_af(i)+drops_break(j)*gain_var_new(j,i)*xl(i)
283 !dropconc_af(i)=dropconc_af(i)+drops_break(j)*nnd(j,i)
288 ! h) recalculation of DSD in bins kr using new concentrations
292 psi1(kr)=dropconc_af(kr)/dm
296 ! 200 FORMAT(1X,I2,2X,5D13.5)
297 ! Eyal's new changes (29/3/15) (end)
300 END SUBROUTINE Spont_Rain_BreakUp
301 ! +-------------------------------------------+
302 SUBROUTINE BreakUp_Snow (Tin,F,FL,X,RF,NKR)
306 INTEGER,INTENT(in) :: NKR
307 real(kind=r8size),INTENT(inout) :: F(:),FL(:),RF(:)
308 real(kind=r8size),INTENT(in) :: X(:)
309 real(kind=r4size),INTENT(in) :: Tin
312 real(kind=r8size) :: G(NKR),GLW(NKR),GRM(NKR),DEL_GLW(NKR),DEL_GRM(NKR), BREAK_SNOW(NKR), &
313 A,GLW_MAX, FLW_MAX, GRM_MAX, FRM_MAX, GMAX
314 INTEGER :: KR,K,KMAX,KMIN
321 if (KR_SNOW_MAX <=NKR) BREAK_SNOW(KR_SNOW_MAX) = BREAK_SNOW_KRMAX_0
322 if (KR_SNOW_MAX-1<=NKR) BREAK_SNOW(KR_SNOW_MAX-1) = BREAK_SNOW_KRMAX_1
323 !if (KR_SNOW_MAX-2<=NKR) BREAK_SNOW(KR_SNOW_MAX-2) = BREAK_SNOW_KRMAX_2
324 !if (KR_SNOW_MAX-3<=NKR) BREAK_SNOW(KR_SNOW_MAX-3) = BREAK_SNOW_KRMAX_3
342 GLW_MAX=GLW_MAX+X(K)*X(K)*F(K)*FL(K)
345 GLW_MAX=GLW_MAX+A*F(KMAX)*FL(KMAX)
352 GRM_MAX=GRM_MAX+X(K)*X(K)*F(K)*(1.0D0-FL(K))*RF(K)
355 GRM_MAX=GRM_MAX+A*F(KMAX)*(1.0D0-FL(KMAX))*RF(KMAX)
362 GMAX=GMAX+X(K)*X(K)*F(K)
369 !FL(KMAX)=FLW_MAX/F(KMAX)
371 IF (F(KMAX) .lt. 1.0E-20)then
382 FL(KMAX) = FLW_MAX/F(KMAX)
385 RF(KMAX) = FRM_MAX/F(KMAX)/(1.0D0-FL(KMAX))
400 G(KMAX)=3.0D0*F(KMAX)*A
401 DO K=KMAX-1,KMIN-1,-1
402 G(K)=F(K)*3.0D0*X(K)*X(K)
404 GRM(K)=G(K)*(1.0D0-FL(K))*RF(K)
408 DEL_GLW(K) = G(K)*BREAK_SNOW(K)*FL(K)
409 GLW(K-1) = GLW(K-1)+DEL_GLW(K)
410 DEL_GRM(K) = G(K)*(1.0D0-FL(K))*RF(K)*BREAK_SNOW(K)
411 GRM(K-1) = GRM(K-1)+DEL_GRM(K)
412 G(K-1) = G(K-1)+G(K)*BREAK_SNOW(K)
413 F(K-1) = G(K-1)/3.0D0/X(K-1)/X(K-1)
415 if (G(k-1) < 1.0d-20) then
425 FL(k-1) = GLW(k-1)/G(k-1)
429 !print*,'SnowBr',GRM(k-1),G(k-1),FL(k-1)
430 RF(k-1) = GRM(k-1)/G(k-1)/(1.0D0-FL(k-1))
434 ! FL(K-1)=GLW(K-1)/G(K-1)
435 ! RF(K-1)=GRM(K-1)/G(K-1)/(1.0D0-FL(K-1))
437 G(K) = G(K)*(1.0D0-BREAK_SNOW(K))
438 F(K) = G(K)/3.0D0/X(K)/X(K)
442 END SUBROUTINE BreakUp_Snow
443 ! +------------------------------+
444 end module module_mp_SBM_BreakUp
445 ! +-----------------------------------------------------------------------------+
446 ! +-----------------------------------------------------------------------------+
447 module module_mp_SBM_Collision
450 public coll_xyy_lwf, coll_xyx_lwf, coll_xxx_lwf, &
451 coll_xyz_lwf, coll_xxy_lwf, &
452 modkrn_KS, coll_breakup_KS, courant_bott_KS
455 INTEGER, PARAMETER, PRIVATE:: R8SIZE = 8
456 INTEGER, PARAMETER, PRIVATE:: R4SIZE = 4
457 integer,parameter :: kp_flux_max = 44
458 real(kind=r8size), parameter :: G_LIM = 1.0D-16 ! [g/cm^3]
459 integer,parameter :: kr_sgs_max = 20 ! rg(20)=218.88 mkm
462 ! +------------------------------------------------+
463 subroutine coll_xyy_lwf (gx,gy,flx,fly,ckxy,x,y, &
464 c,ima,prdkrn,nkr,indc)
467 integer,intent(in) :: nkr
468 real(kind=r8size),intent(inout) :: gy(:),gx(:),fly(:),flx(:)
469 real(kind=r8size),intent(in) :: ckxy(:,:),x(:),y(:),c(:,:)
470 integer,intent(in) :: ima(:,:)
471 real(kind=r8size),intent(in) :: prdkrn
474 real(kind=r8size) :: gmin,ckxy_ji,x01,x02,x03,gsi,gsj,gsk,gsi_w,gsj_w,gsk_w,gk,gk_w,&
475 fl_gk,fl_gsk,flux,x1,flux_w,gy_k_w,gy_kp_old,gy_kp_w
476 integer :: j,jx0,jx1,i,iy0,iy1,jmin,indc,k,kp
481 ! jx0 - lower limit of integration by j
484 if(gx(j).gt.gmin) goto 2000
487 if(jx0.eq.nkr-1) return
489 ! jx1 - upper limit of integration by j
492 if(gx(j).gt.gmin) goto 2010
496 ! iy0 - lower limit of integration by i
499 if(gy(i).gt.gmin) goto 2001
502 if(iy0.eq.nkr-1) return
504 ! iy1 - upper limit of integration by i
507 if(gy(i).gt.gmin) goto 2011
513 if(gy(i).le.gmin) goto 2020
515 if(jmin.eq.nkr-1) return
516 if(i.lt.jx0) jmin=jx0-indc
518 if(gx(j).le.gmin) goto 2021
522 x01=ckxy_ji*gy(i)*gx(j)*prdkrn
523 x02=dmin1(x01,gy(i)*x(j))
524 x03=dmin1(x02,gx(j)*y(i))
528 if(gsk.le.gmin) goto 2021
532 gsk_w=dmin1(gsk_w,gsk)
534 gy(i)=dmax1(gy(i),0.0d0)
536 gx(j)=dmax1(gx(j),0.0d0)
538 if(gk.le.gmin) goto 2021
539 gk_w=gy(k)*fly(k)+gsk_w
547 x1=dlog(gy(kp)/gk+1.d-15)
548 flux=gsk/x1*(dexp(0.5d0*x1)-dexp(x1*(0.5d0-c(i,j))))
552 if(kp.gt.kp_flux_max) flux=0.5d0*flux
554 flux_w=dmin1(flux_w,gsk_w)
555 flux_w=dmin1(flux_w,gk_w)
558 gy(k)=dmax1(gy(k),gmin)
559 gy_k_w=gk*fl_gk-flux_w
560 gy_k_w=dmin1(gy_k_w,gy(k))
561 gy_k_w=dmax1(gy_k_w,0.0d0)
565 gy(kp)=dmax1(gy(kp),gmin)
566 gy_kp_w=gy_kp_old*fly(kp)+flux_w
567 gy_kp_w=dmin1(gy_kp_w,gy(kp))
568 fly(kp)=gy_kp_w/gy(kp)
570 if(fly(k).gt.1.0d0.and.fly(k).le.1.0001d0) &
572 if(fly(kp).gt.1.0d0.and.fly(kp).le.1.0001d0) &
574 if(fly(k).gt.1.0001d0.or.fly(kp).gt.1.0001d0 &
575 .or.fly(k).lt.0.0d0.or.fly(kp).lt.0.0d0) then
577 print*, 'in subroutine coll_xyy_lwf'
579 if(fly(k).gt.1.0001d0) print*, 'fly(k).gt.1.0001d0'
580 if(fly(kp).gt.1.0001d0) print*, 'fly(kp).gt.1.0001d0'
582 if(fly(k).lt.0.0d0) print*, 'fly(k).lt.0.0d0'
583 if(fly(kp).lt.0.0d0) print*, 'fly(kp).lt.0.0d0'
588 print*, 'jx0,jx1,iy0,iy1'
589 print*, jx0,jx1,iy0,iy1
591 print*, 'ckxy(j,i),x01,x02,x03'
592 print 204, ckxy(j,i),x01,x02,x03
594 print*, 'gsi,gsj,gsk'
595 print 203, gsi,gsj,gsk
597 print*, 'gsi_w,gsj_w,gsk_w'
598 print 203, gsi_w,gsj_w,gsk_w
603 print*, 'fl_gk,fl_gsk'
604 print 202, fl_gk,fl_gsk
621 if(fly(k).lt.0.0d0) print*, &
622 'stop 2022: in subroutine coll_xyy_lwf, fly(k) < 0'
624 if(fly(kp).lt.0.0d0) print*, &
625 'stop 2022: in subroutine coll_xyy_lwf, fly(kp) < 0'
627 if(fly(k).gt.1.0001d0) print*, &
628 'stop 2022: in sub. coll_xyy_lwf, fly(k) > 1.0001'
630 if(fly(kp).gt.1.0001d0) print*, &
631 'stop 2022: in sub. coll_xyy_lwf, fly(kp) > 1.0001'
633 call wrf_error_fatal("in coal_bott coll_xyy_lwf, model stop")
634 ! in case fly(k).gt.1.0001d0.or.fly(kp).gt.1.0001d0
635 ! .or.fly(k).lt.0.0d0.or.fly(kp).lt.0.0d0
645 202 format(1x,2d13.5)
646 203 format(1x,3d13.5)
647 204 format(1x,4d13.5)
650 end subroutine coll_xyy_lwf
651 ! +-----------------------------------------------------+
652 subroutine coll_xxx_lwf(g,fl,ckxx,x,c,ima,prdkrn,nkr)
656 integer,intent(in) :: nkr
657 real(kind=r8size),intent(inout) :: g(:),fl(:)
658 real(kind=r8size),intent(in) :: ckxx(:,:),x(:), c(:,:)
659 integer,intent(in) :: ima(:,:)
660 real(kind=r8size),intent(in) :: prdkrn
663 real(kind=r8size):: gmin,x01,x02,x03,gsi,gsj,gsk,gsi_w,gsj_w,gsk_w,gk, &
664 gk_w,fl_gk,fl_gsk,flux,x1,flux_w,g_k_w,g_kp_old,g_kp_w
665 integer :: i,ix0,ix1,j,k,kp
670 ! ix0 - lower limit of integration by i
674 if(g(i).gt.gmin) goto 2000
677 if(ix0.eq.nkr-1) return
679 ! ix1 - upper limit of integration by i
682 if(g(i).gt.gmin) goto 2010
688 if(g(i).le.gmin) goto 2020
690 if(g(j).le.gmin) goto 2021
693 x01=ckxx(i,j)*g(i)*g(j)*prdkrn
694 x02=dmin1(x01,g(i)*x(j))
695 if(j.ne.k) x03=dmin1(x02,g(j)*x(i))
700 if(gsk.le.gmin) goto 2021
704 gsk_w=dmin1(gsk_w,gsk)
706 g(i)=dmax1(g(i),0.0d0)
708 ! new change of 23.01.11 (start)
709 if(j.ne.k) g(j)=dmax1(g(j),0.0d0)
710 ! new change of 23.01.11 (end)
713 if(g(j).lt.0.d0.and.gk.le.gmin) then
719 if(gk.le.gmin) goto 2021
721 gk_w=g(k)*fl(k)+gsk_w
727 x1=dlog(g(kp)/gk+1.d-15)
728 flux=gsk/x1*(dexp(0.5d0*x1)-dexp(x1*(0.5d0-c(i,j))))
731 if(kp.gt.kp_flux_max) flux=0.5d0*flux
733 flux_w=dmin1(flux_w,gsk_w)
734 flux_w=dmin1(flux_w,gk_w)
736 g(k)=dmax1(g(k),gmin)
738 g_k_w=dmin1(g_k_w,g(k))
739 g_k_w=dmax1(g_k_w,0.0d0)
743 g(kp)=dmax1(g(kp),gmin)
744 g_kp_w=g_kp_old*fl(kp)+flux_w
745 g_kp_w=dmin1(g_kp_w,g(kp))
748 if(fl(k).gt.1.0d0.and.fl(k).le.1.0001d0) &
751 if(fl(kp).gt.1.0d0.and.fl(kp).le.1.0001d0) &
754 if(fl(k).gt.1.0001d0.or.fl(kp).gt.1.0001d0 &
755 .or.fl(k).lt.0.0d0.or.fl(kp).lt.0.0d0) then
757 print*, 'in subroutine coll_xxx_lwf'
758 print*, 'snow - snow = snow'
760 if(fl(k).gt.1.0001d0) print*, 'fl(k).gt.1.0001d0'
761 if(fl(kp).gt.1.0001d0) print*, 'fl(kp).gt.1.0001d0'
763 if(fl(k).lt.0.0d0) print*, 'fl(k).lt.0.0d0'
764 if(fl(kp).lt.0.0d0) print*, 'fl(kp).lt.0.0d0'
771 print*, 'ckxx(i,j),x01,x02,x03'
772 print 204, ckxx(i,j),x01,x02,x03
774 print*, 'gsi,gsj,gsk'
775 print 203, gsi,gsj,gsk
777 print*, 'gsi_w,gsj_w,gsk_w'
778 print 203, gsi_w,gsj_w,gsk_w
783 print*, 'fl_gk,fl_gsk'
784 print 202, fl_gk,fl_gsk
801 if(fl(k).lt.0.0d0) print*, &
802 'stop 2022: in subroutine coll_xxx_lwf, fl(k) < 0'
804 if(fl(kp).lt.0.0d0) print*, &
805 'stop 2022: in subroutine coll_xxx_lwf, fl(kp) < 0'
807 if(fl(k).gt.1.0001d0) print*, &
808 'stop 2022: in sub. coll_xxx_lwf, fl(k) > 1.0001'
810 if(fl(kp).gt.1.0001d0) print*, &
811 'stop 2022: in sub. coll_xxx_lwf, fl(kp) > 1.0001'
812 call wrf_error_fatal("in coal_bott sub. coll_xxx_lwf, model stop")
822 202 format(1x,2d13.5)
823 203 format(1x,3d13.5)
824 204 format(1x,4d13.5)
827 end subroutine coll_xxx_lwf
828 ! +----------------------------------------------------+
829 subroutine coll_xyx_lwf (gx,gy,flx,fly,ckxy,x,y, &
830 c,ima,prdkrn,nkr,indc,dm_rime)
833 integer,intent(in) :: nkr
834 real(kind=r8size),intent(inout) :: gy(:),gx(:),fly(:),flx(:),dm_rime(:)
835 real(kind=r8size),intent(in) :: ckxy(:,:),x(:),y(:),c(:,:),prdkrn
836 integer,intent(in) :: ima(:,:)
839 real(kind=r8size) :: gmin,x01,x02,x03,gsi,gsj,gsk,gk,flux,x1,gsi_w,gsj_w,gsk_w, &
840 gk_w,fl_gk,fl_gsk,flux_w,gx_k_w,gx_kp_old,gx_kp_w,frac_split
841 integer :: j, jx0, jx1, i, iy0, iy1, jmin, indc, k, kp
846 ! jx0 - lower limit of integration by j
849 if(gx(j).gt.gmin) goto 2000
852 if(jx0.eq.nkr-1) return
853 ! jx1 - upper limit of integration by j
856 if(gx(j).gt.gmin) goto 2010
859 ! iy0 - lower limit of integration by i
862 if(gy(i).gt.gmin) goto 2001
865 if(iy0.eq.nkr-1) return
866 ! iy1 - upper limit of integration by i
869 if(gy(i).gt.gmin) goto 2011
879 if(gy(i).le.gmin) goto 2020
881 if(jmin.eq.nkr-1) return
882 if(i.lt.jx0) jmin=jx0-indc
884 if(gx(j).le.gmin) goto 2021
887 x01=ckxy(j,i)*gy(i)*gx(j)*prdkrn
888 x02=dmin1(x01,gy(i)*x(j))
889 ! new change of 20.01.11 (start)
890 if(j.ne.k) x03=dmin1(x02,gx(j)*y(i))
892 ! new change of 20.01.11 (end)
896 if(gsk.le.gmin) goto 2021
900 gsk_w=dmin1(gsk_w,gsk)
902 gy(i)=dmax1(gy(i),0.0d0)
904 ! new change of 20.01.11 (start)
905 if(j.ne.k) gx(j)=dmax1(gx(j),0.0d0)
906 ! new change of 20.01.11 (end)
908 if(gk.le.gmin) goto 2021
909 gk_w=gx(k)*flx(k)+gsk_w
914 x1=dlog(gx(kp)/gk+1.d-15)
915 flux=gsk/x1*(dexp(0.5d0*x1)-dexp(x1*(0.5d0-c(i,j))))
919 if(kp.gt.kp_flux_max) flux=0.5d0*flux
921 flux_w=dmin1(flux_w,gsk_w)
922 flux_w=dmin1(flux_w,gk_w)
923 frac_split = flux/gsk
924 if(frac_split < 0.) frac_split = 0.
925 if(frac_split > 1.) frac_split = 1.
926 dm_rime(k)=dm_rime(k)+gsi*(1.-frac_split)
927 dm_rime(kp)=dm_rime(kp)+gsi*frac_split
929 gx(k)=dmax1(gx(k),gmin)
932 gx_k_w=dmin1(gx_k_w,gx(k))
933 gx_k_w=dmax1(gx_k_w,0.0d0)
937 gx(kp)=dmax1(gx(kp),gmin)
939 gx_kp_w=gx_kp_old*flx(kp)+flux_w
940 gx_kp_w=dmin1(gx_kp_w,gx(kp))
942 flx(kp)=gx_kp_w/gx(kp)
944 if(flx(k).gt.1.0d0.and.flx(k).le.1.0001d0) &
947 if(flx(kp).gt.1.0d0.and.flx(kp).le.1.0001d0) &
950 if(flx(k).gt.1.0001d0.or.flx(kp).gt.1.0001d0 &
951 .or.flx(k).lt.0.0d0.or.flx(kp).lt.0.0d0) then
953 print*, 'in subroutine coll_xyx_lwf'
955 if(flx(k).gt.1.0001d0) &
956 print*, 'flx(k).gt.1.0001d0'
958 if(flx(kp).gt.1.0001d0) &
959 print*, 'flx(kp).gt.1.0001d0'
961 if(flx(k).lt.0.0d0) print*, 'flx(k).lt.0.0d0'
962 if(flx(kp).lt.0.0d0) print*, 'flx(kp).lt.0.0d0'
967 print*, 'jx0,jx1,iy0,iy1'
968 print*, jx0,jx1,iy0,iy1
973 print*, 'ckxy(j,i),x01,x02,x03'
974 print 204, ckxy(j,i),x01,x02,x03
976 print*, 'gsi,gsj,gsk'
977 print 203, gsi,gsj,gsk
979 print*, 'gsi_w,gsj_w,gsk_w'
980 print 203, gsi_w,gsj_w,gsk_w
985 print*, 'fl_gk,fl_gsk'
986 print 202, fl_gk,fl_gsk
1003 if(flx(k).lt.0.0d0) print*, &
1004 'stop 2022: in subroutine coll_xyx_lwf, flx(k) < 0'
1006 if(flx(kp).lt.0.0d0) print*, &
1007 'stop 2022: in subroutine coll_xyx_lwf, flx(kp) < 0'
1009 if(flx(k).gt.1.0001d0) print*, &
1010 'stop 2022: in sub. coll_xyx_lwf, flx(k) > 1.0001'
1012 if(flx(kp).gt.1.0001d0) print*, &
1013 'stop 2022: in sub. coll_xyx_lwf, flx(kp) > 1.0001'
1014 call wrf_error_fatal("fatal error in module_mp_fast_sbm in coll_xyx_lwf (stop 2022), model stop")
1024 201 format(1x,d13.5)
1025 202 format(1x,2d13.5)
1026 203 format(1x,3d13.5)
1027 204 format(1x,4d13.5)
1030 end subroutine coll_xyx_lwf
1031 ! -------------------------------------------------------+
1032 subroutine coll_xyz_lwf(gx,gy,gz,flx,fly,flz,ckxy,x,y, &
1033 c,ima,prdkrn,nkr,indc)
1037 integer,intent(in) :: nkr
1038 real(kind=r8size),intent(inout) :: gx(:),gy(:),gz(:),flx(:),fly(:),flz(:)
1039 real(kind=r8size),intent(in) :: ckxy(:,:),x(:),y(:),c(:,:)
1040 integer,intent(in) :: ima(:,:)
1041 real(kind=r8size),intent(in) :: prdkrn
1044 real(kind=r8size) :: gmin,ckxy_ji,x01,x02,x03,gsi,gsj,gsk,gsi_w,gsj_w,gsk_w,gk, &
1045 gk_w,fl_gk,fl_gsk,flux,x1,flux_w,gz_k_w,gz_kp_old,gz_kp_w
1046 integer :: j,jx0,jx1,i,iy0,iy1,jmin,indc,k,kp
1051 ! jx0 - lower limit of integration by j
1054 if(gx(j).gt.gmin) goto 2000
1057 if(jx0.eq.nkr-1) return
1059 ! jx1 - upper limit of integration by j
1062 if(gx(j).gt.gmin) goto 2010
1066 ! iy0 - lower limit of integration by i
1069 if(gy(i).gt.gmin) goto 2001
1072 if(iy0.eq.nkr-1) return
1074 ! iy1 - upper limit of integration by i
1077 if(gy(i).gt.gmin) goto 2011
1084 if(gy(i).le.gmin) goto 2020
1086 if(jmin.eq.nkr-1) return
1087 if(i.lt.jx0) jmin=jx0-indc
1089 if(gx(j).le.gmin) goto 2021
1093 x01=ckxy_ji*gy(i)*gx(j)*prdkrn
1094 x02=dmin1(x01,gy(i)*x(j))
1095 x03=dmin1(x02,gx(j)*y(i))
1099 if(gsk.le.gmin) goto 2021
1103 gsk_w=dmin1(gsk_w,gsk)
1105 gy(i)=dmax1(gy(i),0.0d0)
1108 gx(j)=dmax1(gx(j),0.0d0)
1112 if(gk.le.gmin) goto 2021
1114 gk_w=gz(k)*flz(k)+gsk_w
1123 x1=dlog(gz(kp)/gk+1.d-15)
1125 flux=gsk/x1*(dexp(0.5d0*x1)-dexp(x1*(0.5d0-c(i,j))))
1126 flux=dmin1(flux,gsk)
1129 if(kp.gt.kp_flux_max) flux=0.5d0*flux
1132 flux_w=dmin1(flux_w,gsk_w)
1133 flux_w=dmin1(flux_w,gk_w)
1136 gz(k)=dmax1(gz(k),gmin)
1138 gz_k_w=gk*fl_gk-flux_w
1139 gz_k_w=dmin1(gz_k_w,gz(k))
1140 gz_k_w=dmax1(gz_k_w,0.0d0)
1147 gz(kp)=dmax1(gz(kp),gmin)
1149 gz_kp_w=gz_kp_old*flz(kp)+flux_w
1150 gz_kp_w=dmin1(gz_kp_w,gz(kp))
1152 flz(kp)=gz_kp_w/gz(kp)
1154 if(flz(k).gt.1.0d0.and.flz(k).le.1.0001d0) &
1157 if(flz(kp).gt.1.0d0.and.flz(kp).le.1.0001d0) &
1160 if(flz(k).gt.1.0001d0.or.flz(kp).gt.1.0001d0 &
1161 .or.flz(k).lt.0.0d0.or.flz(kp).lt.0.0d0) then
1163 print*, 'in subroutine coll_xyz_lwf'
1165 if(flz(k).gt.1.0001d0) print*, 'flz(k).gt.1.0001d0'
1166 if(flz(kp).gt.1.0001d0) print*, 'flz(kp).gt.1.0001d0'
1168 if(flz(k).lt.0.0d0) print*, 'flz(k).lt.0.0d0'
1169 if(flz(kp).lt.0.0d0) print*, 'flz(kp).lt.0.0d0'
1174 print*, 'jx0,jx1,iy0,iy1'
1175 print*, jx0,jx1,iy0,iy1
1178 print 201, gz_kp_old
1180 print*, 'x01,x02,x03'
1181 print 203, x01,x02,x03
1183 print*, 'gsi,gsj,gsk'
1184 print 203, gsi,gsj,gsk
1186 print*, 'gsi_w,gsj_w,gsk_w'
1187 print 203, gsi_w,gsj_w,gsk_w
1192 print*, 'fl_gk,fl_gsk'
1193 print 202, fl_gk,fl_gsk
1196 print 202, x1,c(i,j)
1210 if(flz(k).lt.0.0d0) print*, &
1211 'stop 2022: in subroutine coll_xyz_lwf, flz(k) < 0'
1213 if(flz(kp).lt.0.0d0) print*, &
1214 'stop 2022: in subroutine coll_xyz_lwf, flz(kp) < 0'
1216 if(flz(k).gt.1.0001d0) print*, &
1217 'stop 2022: in sub. coll_xyz_lwf, flz(k) > 1.0001'
1219 if(flz(kp).gt.1.0001d0) print*, &
1220 'stop 2022: in sub. coll_xyz_lwf, flz(kp) > 1.0001'
1221 call wrf_error_fatal("fatal error: in sub. coll_xyz_lwf,model stop")
1230 201 format(1x,d13.5)
1231 202 format(1x,2d13.5)
1232 203 format(1x,3d13.5)
1233 204 format(1x,4d13.5)
1236 end subroutine coll_xyz_lwf
1237 ! -----------------------------------------------+
1238 subroutine coll_xxy_lwf(gx,gy,flx,fly,ckxx,x, &
1243 integer,intent(in) :: nkr
1244 real(kind=r8size),intent(inout):: gx(nkr),gy(nkr),flx(nkr),fly(nkr)
1245 real(kind=r8size),intent(in) :: x(nkr),ckxx(nkr,nkr),c(nkr,nkr)
1246 real(kind=r8size),intent(in) :: prdkrn
1247 integer,intent(in) :: ima(nkr,nkr)
1250 real(kind=r8size) :: gmin,ckxx_ij,x01,x02,x03,gsi,gsj,gsk,gsi_w,gsj_w,gsk_w, &
1251 gk,gk_w,flux,flux_w,fl_gk,fl_gsk,x1,gy_k_w,gy_kp_w, &
1253 integer::i,ix0,ix1,j,k,kp
1259 ! ix0 - lower limit of integration by i
1262 if(gx(i).gt.gmin) goto 2000
1265 if(ix0.eq.nkr-1) return
1267 ! ix1 - upper limit of integration by i
1270 if(gx(i).gt.gmin) goto 2010
1276 if(gx(i).le.gmin) goto 2020
1278 if(gx(j).le.gmin) goto 2021
1282 x01=ckxx_ij*gx(i)*gx(j)*prdkrn
1283 x02=dmin1(x01,gx(i)*x(j))
1284 x03=dmin1(x02,gx(j)*x(i))
1289 if(gsk.le.gmin) goto 2021
1294 gsk_w=dmin1(gsk_w,gsk)
1297 gx(i)=dmax1(gx(i),0.0d0)
1300 gx(j)=dmax1(gx(j),0.0d0)
1304 if(gk.le.gmin) goto 2021
1306 gk_w=gy(k)*fly(k)+gsk_w
1313 x1=dlog(gy(kp)/gk+1.d-15)
1314 ! print *,'nir1',gy(kp),gk,kp,i,j
1315 flux=gsk/x1*(dexp(0.5d0*x1)-dexp(x1*(0.5d0-c(i,j))))
1316 flux=dmin1(flux,gsk)
1319 if(kp.gt.kp_flux_max) flux=0.5d0*flux
1322 flux_w=dmin1(flux_w,gk_w)
1323 flux_w=dmin1(flux_w,gsk_w)
1324 flux_w=dmax1(flux_w,0.0d0)
1327 gy_k_w=gk*fl_gk-flux_w
1328 gy_k_w=dmin1(gy_k_w,gy(k))
1329 gy_k_w=dmax1(gy_k_w,0.0d0)
1330 ! print *,'nirxxylwf4',k,gy(k),gy_k_w,x1,flux
1331 if (gy(k)/=0.0) then
1338 gy_kp_w=gy_kp_old*fly(kp)+flux_w
1339 gy_kp_w=dmin1(gy_kp_w,gy(kp))
1340 if (gy(kp)/=0.0) then
1341 fly(kp)=gy_kp_w/gy(kp)
1347 if(fly(k).gt.1.0d0.and.fly(k).le.1.0001d0) &
1350 if(fly(kp).gt.1.0d0.and.fly(kp).le.1.0001d0) &
1360 end subroutine coll_xxy_lwf
1361 ! +-------------------------------------------+
1362 SUBROUTINE INTERPOL_SE (NH, H_TAB, X_TAB, H, X)
1367 real(kind=r4size) :: H_TAB(NH), X_TAB(NH)
1368 real(kind=r8size) :: H, X
1372 IF(H > H_TAB(1)) THEN
1377 IF(H < H_TAB(NH)) THEN
1383 IF(H > H_TAB(I)) THEN
1385 X = X_TAB(J)+(X_TAB(I)-X_TAB(J))/ &
1386 (H_TAB(I)-H_TAB(J))*(H-H_TAB(J))
1393 END SUBROUTINE INTERPOL_SE
1394 ! +-------------------------------------------------------------------------------+
1395 subroutine modkrn_KS (tt,qq,pp,rho,factor_t,ttcoal,ICase,Icondition, &
1400 real(kind=r8size),intent(in) :: tt, pp
1401 real(kind=r8size),intent(inout) :: qq
1402 real(kind=r4size),intent(in) :: ttcoal, rho
1403 real(kind=r8size),intent(out) :: factor_t
1404 integer :: ICase, Iin, Jin, Kin, Icondition
1406 real(kind=r8size) :: satq2, temp, epsf, tc, ttt1, ttt, qs2, qq1, dele, tc_min, &
1407 tc_max, factor_max, factor_min, f, t, a, b, c, p, d
1408 real(kind=r8size) :: at, bt, ct, dt
1409 real(kind=r8size) :: AA,BB,CC,DD,Es,Ew,AA1_MY,BB1_MY
1410 real(kind=r4size) :: tt_r, T_tab(7), SE_tab(7)
1412 satq2(t,p) = 3.80d3*(10**(9.76421d0-2667.1d0/t))/p
1413 temp(a,b,c,d,t) = d*t*t*t+c*t*t+b*t+a
1417 if (tc > 0.0) return
1423 !satq2(t,p) = 3.80d3*(10**(9.76421d0-2667.1d0/t))/p
1424 !temp(a,b,c,d,t) = d*t*t*t+c*t*t+b*t+a
1426 data at, bt, ct, dt /0.88333d0, 0.0931878d0, 0.0034793d0, 4.5185186d-05/
1428 if(qq.le.0.0) qq = 1.0e-15
1432 ttt1 =temp(at,bt,ct,dt,tc)
1435 qq1 =qq*(0.622d0+0.378d0*qs2)/(0.622d0+0.378d0*qq)/qs2
1438 if(tc.ge.-6.0d0) then
1440 if(factor_t.lt.epsf) factor_t = epsf
1441 if(factor_t.gt.1.0d0) factor_t = 1.0d0
1444 if (Icondition == 0) then
1445 if(tc.ge.-12.5d0 .and. tc.lt.-6.0d0) factor_t = 0.5D0 ! 0.5d0 !### (KS-ICE-SNOW)
1446 if(tc.ge.-17.0d0 .and. tc.lt.-12.5d0) factor_t = 1.0
1447 if(tc.ge.-20.0d0 .and. tc.lt.-17.0d0) factor_t = 0.4d0
1449 if(tc.ge.-12.5d0 .and. tc.lt.-6.0d0) factor_t = 0.3D0 ! 0.5d0 !### (KS-ICE-SNOW)
1450 if(tc.ge.-17.0d0 .and. tc.lt.-12.5d0) factor_t = 0.1d0
1451 if(tc.ge.-20.0d0 .and. tc.lt.-17.0d0) factor_t = 0.05d0
1454 if(tc.lt.-20.0d0) then
1455 tc_min = ttcoal-273.15d0
1457 if(Icondition == 0)then
1465 f = factor_min + (tc-tc_min)*(factor_max-factor_min)/ &
1468 ! in case tc.lt.-20.0d0
1471 if(tc.lt.-40.0d0) then
1475 if (factor_t > 1.0) factor_t = 1.0
1477 if(tc.ge.0.0d0) then
1483 ! ... Dashed-dotted (linear)
1484 T_tab = [0.0, -0.813, -5.26, -10.13, -14.63, -20.02, -40.0 ]
1485 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) ]
1488 CALL INTERPOL_SE (size(SE_tab), T_TAB, SE_TAB, TC, factor_t)
1490 if(tc < -40.0d0) then
1494 if (factor_t > 1.0) factor_t = 1.0
1503 end subroutine modkrn_KS
1504 ! +-----------------------------------------------------------+
1505 subroutine coll_breakup_KS (gt_mg, xt_mg, jmax, dt, jbreak, &
1506 PKIJ, QKJ, NKRinput, NKR)
1510 integer,intent(in) :: jmax, jbreak, NKRInput, NKR
1511 real(kind=r8size),intent(in) :: xt_mg(:), dt
1512 real(kind=r4size),intent(in) :: pkij(:,:,:),qkj(:,:)
1513 real(kind=r8size),intent(inout) :: gt_mg(:)
1518 integer,parameter :: ia=1, ja=1, ka=1
1519 integer :: ie, je, ke, nkrdiff, jdiff, k, i, j
1520 real(kind=r8size),parameter :: eps = 1.0d-20
1521 real(kind=r8size) :: gt(jmax), xt(jmax+1), ft(jmax), fa(jmax), dg(jmax), df(jmax), dbreak(jbreak) &
1522 ,amweight(jbreak), gain, aloss
1531 ! gt_mg : mass distribution function of Bott
1532 ! xt_mg : mass of bin in mg
1533 ! jmax : number of bins
1534 ! dt : timestep in s
1538 nkrdiff = nkrinput-nkr
1542 ft(j)=gt(j)/xt(j)/xt(j)
1545 !shift between coagulation and breakup grid
1549 !shift to breakup grid
1552 fa(k)=ft(k+jdiff+nkrdiff)
1555 !breakup: bleck's first order method
1556 !pkij: gain coefficients
1557 !qkj : loss coefficients
1559 xt(jmax+1)=xt(jmax)*2.0d0
1567 gain=gain+fa(i)*fa(j)*pkij(k,i,j)
1572 aloss=aloss+fa(j)*qkj(k,j)
1574 j=jmax-jbreak+k+nkrdiff
1575 amweight(k)=2.0/(xt(j+1)**2.0-xt(j)**2.0)
1576 dbreak(k)=amweight(k)*(gain-fa(k)*aloss)
1578 if(dbreak(k) .ne. dbreak(k)) then
1579 print*,dbreak(k),amweight(k),gain,fa(k),aloss
1585 print*,j,jmax,jbreak,k,nkrdiff
1592 call wrf_error_fatal(" inside coll_breakup, NaN, model stop")
1596 !shift rate to coagulation grid
1598 do j=1,jdiff+nkrdiff
1603 df(j+jdiff)=dbreak(j)
1606 !transformation to mass distribution function g(ln x)
1608 dg(j)=df(j)*xt(j)*xt(j)
1614 gt(j)=gt(j)+dg(j)*dt
1615 ! if(gt(j)<0.0) then
1616 !print*, 'gt(j) < 0'
1619 !print*, 'dg(j),dt,gt(j)'
1620 !print*, dg(j),dt,gt(j)
1621 !hlp=dmin1(gt(j),hlp)
1626 ! print*,'gt_mg',gt_mg
1627 !stop "in coll_breakup_ks gt(kr) < 0.0 "
1634 end subroutine coll_breakup_KS
1635 ! +----------------------------------------------------+
1636 subroutine courant_bott_KS(xl, nkr, chucm, ima, scal)
1640 integer,intent(in) :: nkr
1641 real,intent(in) :: xl(:)
1642 real(kind=r8size),intent(inout) :: chucm(:,:)
1643 integer,intent(inout) :: ima(:,:)
1644 real(kind=r8size),intent(in) :: scal
1647 integer :: k, kk, j, i
1648 real(kind=r8size) :: x0, xl_mg(nkr), dlnr
1651 ! ima(i,j) - k-category number,
1652 ! chucm(i,j) - courant number :
1653 ! logarithmic grid distance(dlnr) :
1655 !xl_mg(0)=xl_mg(1)/2
1656 xl_mg(1:nkr) = xl(1:nkr)*1.0D3
1658 dlnr=dlog(2.0d0)/(3.0d0*scal)
1662 x0 = xl_mg(i) + xl_mg(j)
1664 !if(k == 1) goto 1000 ! ### (KS)
1666 if(k == 1) goto 1000
1667 if(xl_mg(k) >= x0 .and. xl_mg(k-1) < x0) then
1668 chucm(i,j) = dlog(x0/xl_mg(k-1))/(3.d0*dlnr)
1669 if(chucm(i,j) > 1.0d0-1.d-08) then
1673 ima(i,j) = min(nkr-1,kk-1)
1674 !if (ima(i,j) == 0) then
1682 !if(i.eq.nkr.or.j.eq.nkr) ima(i,j)=nkr
1683 chucm(j,i) = chucm(i,j)
1689 end subroutine courant_bott_KS
1690 ! +----------------------------------+
1691 end module module_mp_SBM_Collision
1692 ! +-----------------------------------------------------------------------------+
1693 ! +-----------------------------------------------------------------------------+
1694 module module_mp_SBM_Auxiliary
1697 public :: POLYSVP, JERRATE_KS, JERTIMESC_KS, JERSUPSAT_KS, &
1698 JERDFUN_KS, JERDFUN_NEW_KS, Relaxation_Time
1701 INTEGER, PARAMETER, PRIVATE:: R8SIZE = 8
1702 INTEGER, PARAMETER, PRIVATE:: R4SIZE = 4
1704 INTEGER,PARAMETER :: ISIGN_KO_1 = 0, ISIGN_KO_2 = 0, ISIGN_3POINT = 1, &
1705 IDebug_Print_DebugModule = 1
1706 DOUBLE PRECISION,PARAMETER::COEFF_REMAPING = 0.0066667D0
1707 DOUBLE PRECISION,PARAMETER::VENTPL_MAX = 5.0D0
1709 DOUBLE PRECISION,PARAMETER::RW_PW_MIN = 1.0D-10
1710 DOUBLE PRECISION,PARAMETER::RI_PI_MIN = 1.0D-10
1711 DOUBLE PRECISION,PARAMETER::RW_PW_RI_PI_MIN = 1.0D-10
1712 DOUBLE PRECISION,PARAMETER::RATIO_ICEW_MIN = 1.0D-4
1715 ! +----------------------------------------------------------+
1716 double precision FUNCTION POLYSVP (TT,ITYPE)
1720 real,intent(in) :: TT
1721 integer,intent(in) :: ITYPE
1723 real(4),parameter :: C1 = -9.09718E0, C2 = -3.56654E0, C3 = 0.876793E0, C4 = 0.78583503E0, &
1724 AA1_MY = 2.53E12, BB1_MY = 5.42E3, AA2_MY = 3.41E13, BB2_MY = 6.13E3
1725 real(4) :: ES1N, ES2N
1727 method_select: SELECT CASE(ITYPE)
1731 ES1N = AA1_MY*EXP(-BB1_MY/TT)
1732 POLYSVP = ES1N ! [dyn/cm2] to [mb]
1736 ES2N = AA2_MY*EXP(-BB2_MY/TT)
1737 POLYSVP = ES2N ! [dyn/cm2] to [mb]
1739 END SELECT method_select
1742 end function POLYSVP
1743 ! + -------------------------------------------------------- +
1744 SUBROUTINE JERRATE_KS (xlS, &
1748 ID,IN,fl1,NKR,ICEMAX)
1752 INTEGER,INTENT(IN) :: ID, IN, NKR, ICEMAX
1753 REAL(KIND=r4size),INTENT(IN) :: RO1BL(NKR,ID),RIEC(NKR,ID),FL1(NKR)
1754 REAL(KIND=r4size),INTENT(INOUT) :: B11_MY(NKR,ID)
1755 REAL(KIND=r8size),INTENT(IN) :: PP, TP, xlS(NKR,ID),Vxl(NKR,ID)
1758 INTEGER :: KR, nskin(nkr), ICE
1759 REAL(KIND=r4size) :: VENTPLM(NKR), FD1(NKR,ICEMAX),FK1(NKR,ICEMAX), xl_MY1(NKR,ICEMAX), &
1760 AL1_MY(2),ESAT1(2), TPreal
1761 REAL(KIND=r8size) :: PZERO, TZERO, CONST, D_MY, COEFF_VISCOUS, SHMIDT_NUMBER, &
1762 A, B, RVT, SHMIDT_NUMBER03, XLS_KR_ICE, RO1BL_KR_ICE, VXL_KR_ICE, REINOLDS_NUMBER, &
1763 RESHM, VENTPL, CONSTL, DETL
1765 REAL(KIND=r4size) :: deg01,deg03
1767 ! A1L_MY - CONSTANTS FOR "MAXWELL": MKS
1768 REAL(KIND=r8size),parameter:: RV_MY=461.5D4, CF_MY=2.4D3, D_MYIN=0.211D0
1772 ! RV_MY, CM*CM/SEC/SEC/KELVIN - INDIVIDUAL GAS CONSTANT
1776 ! D_MYIN, CM*CM/SEC - COEFFICIENT OF DIFFUSION OF WATER VAPOUR
1780 ! PZERO, DYNES/CM/CM - REFERENCE PRESSURE
1784 ! TZERO, KELVIN - REFERENCE TEMPERATURE
1789 if (in==2 .and. fl1(kr)==0.0 .or. in==6 .or. in==3 .and. tp<273.15) then
1791 else !in==1 or in==6 or lef/=0
1796 ! CONSTANTS FOR CLAUSIUS-CLAPEYRON EQUATION :
1798 ! A1_MY(1),G/SEC/SEC/CM
1802 ! A1_MY(2),G/SEC/SEC/CM
1814 ! AL1_MY(1), CM*CM/SEC/SEC - LATENT HEAT OF VAPORIZATION
1818 ! AL1_MY(2), CM*CM/SEC/SEC - LATENT HEAT OF SUBLIMATION
1822 ! CF_MY, G*CM/SEC/SEC/SEC/KELVIN - COEFFICIENT OF
1823 ! THERMAL CONDUCTIVITY OF AIR
1831 ! coefficient of diffusion
1833 D_MY=D_MYIN*(PZERO/PP)*(TP/TZERO)**1.94D0
1835 ! coefficient of viscousity
1837 ! COEFF_VISCOUS=0.13 cm*cm/sec
1839 COEFF_VISCOUS=0.13D0
1843 SHMIDT_NUMBER=COEFF_VISCOUS/D_MY
1845 ! Constants used for calculation of Reinolds number
1847 A=2.0D0*(3.0D0/4.0D0/3.141593D0)**DEG01
1851 ! ESAT1(IN)=A1_MY(IN)*DEXP(-BB1_MY(IN)/TP)
1858 ! ... (KS) - update the saturation vapor pressure
1862 ESAT1(1) = POLYSVP(TPreal,0)
1863 ESAT1(2) = POLYSVP(TPreal,1)
1869 SHMIDT_NUMBER03=SHMIDT_NUMBER**DEG03
1874 xlS_KR_ICE=xlS(KR,ICE)
1875 RO1BL_KR_ICE=RO1BL(KR,ICE)
1876 Vxl_KR_ICE=Vxl(KR,ICE)
1879 B*Vxl_KR_ICE*(xlS_KR_ICE/RO1BL_KR_ICE)**DEG03
1880 RESHM=DSQRT(REINOLDS_NUMBER)*SHMIDT_NUMBER03
1882 IF(REINOLDS_NUMBER<2.5D0) THEN
1883 VENTPL=1.0D0+0.108D0*RESHM*RESHM
1886 VENTPL=0.78D0+0.308D0*RESHM
1893 ! VENTPL_MAX is given in MICRO.PRM include file
1899 IF(VENTPL>VENTPL_MAX) THEN
1904 CONSTL=CONST*RIEC(KR,ICE)
1906 FD1(KR,ICE)=RVT/D_MY/ESAT1(nskin(kr))
1907 FK1(KR,ICE)=(AL1_MY(nskin(kr))/RVT-1.0D0)*AL1_MY(nskin(kr))/CF_MY/TP
1909 xl_MY1(KR,ICE)=VENTPL*CONSTL
1911 DETL=FK1(KR,ICE)+FD1(KR,ICE)
1912 B11_MY(KR,ICE)=xl_MY1(KR,ICE)/DETL
1921 END SUBROUTINE JERRATE_KS
1923 ! SUBROUTINE JERRATE
1924 ! ................................................................................
1925 SUBROUTINE JERTIMESC_KS (FI1,X1,SFN11, &
1926 B11_MY,CF,ID,NKR,ICEMAX,COL)
1931 INTEGER,INTENT(IN) :: ID,NKR,ICEMAX
1932 REAL(KIND=r4size),INTENT(in) :: B11_MY(NKR,ID), FI1(NKR,ID), COL, CF
1933 REAL(KIND=r8size),INTENT(in) :: X1(NKR,ID)
1934 REAL(KIND=r4size),INTENT(out) :: SFN11(ID)
1939 REAL(KIND=r4size) :: SFN11S, FK, DELM, FUN, B11
1944 SFN11(ICE)=CF*SFN11S
1946 ! value of size distribution functions
1949 DELM=X1(KR,ICE)*3.0D0*COL
1950 ! integral's expression
1952 ! values of integrals
1954 SFN11S=SFN11S+FUN*B11
1958 SFN11(ICE)=CF*SFN11S
1964 END SUBROUTINE JERTIMESC_KS
1965 ! +--------------------------------------------------------+
1966 SUBROUTINE JERSUPSAT_KS (DEL1,DEL2,DEL1N,DEL2N, &
1968 DT,DEL1INT,DEL2INT,DYN1,DYN2, &
1969 ISYM1,ISYM2,ISYM3,ISYM4,ISYM5)
1973 INTEGER,INTENT(INOUT) :: ISYM1, ISYM2(:), ISYM3, ISYM4, ISYM5
1974 REAL(KIND=r4size),INTENT(IN) :: DT, DYN1, DYN2
1975 REAL(KIND=r8size),INTENT(IN) :: DEL1, DEL2
1976 REAL(KIND=r8size),INTENT(INOUT) :: DEL1N,DEL2N,DEL1INT,DEL2INT,RW, PW, RI, PI
1979 INTEGER :: I, ISYMICE, IRW, IPW, IRI, IPI
1980 REAL(KIND=r8size) :: X, EXPM1, DETER, EXPR, EXPP, A, ALFA, BETA, GAMA, G31, G32, G2, EXPB, EXPG, &
1981 C11, C21, C12, C22, A1DEL1N, A2DEL1N, A3DEL1N, A4DEL1N, A1DEL1INT, A2DEL1INT, &
1982 A3DEL1INT, A4DEL1INT, A1DEL2N, A2DEL2N, A3DEL2N , A4DEL2N, A1DEL2INT, A2DEL2INT, &
1983 A3DEL2INT, A4DEL2INT, A5DEL2INT
1986 EXPM1(x)=x+x*x/2.0D0+x*x*x/6.0D0+x*x*x*x/24.0D0+ &
1989 ISYMICE = sum(ISYM2) + ISYM3 + ISYM4 + ISYM5
1995 IF(max(RW,PW,RI,PI)<=RW_PW_RI_PI_MIN) THEN
2010 IF(DMAX1(RW,PW)>RW_PW_MIN) THEN
2012 ! ... (KS) - A zero can pass through, assign a minimum value
2013 IF(RW < RW_PW_MIN*RW_PW_MIN) THEN
2017 IF(PW < RW_PW_MIN*RW_PW_MIN)THEN
2022 IF(DMAX1(PI/PW,RI/RW)<=RATIO_ICEW_MIN) THEN
2031 IF(DMIN1(PI/PW,RI/RW)>1.0D0/RATIO_ICEW_MIN) THEN
2051 IF(ISYMICE == 0)THEN
2061 IF(IRW == 0 .AND. IRI == 0) THEN
2065 DEL1INT=DEL1*DT+DYN1*DT*DT/2.0D0
2066 DEL2INT=DEL2*DT+DYN2*DT*DT/2.0D0
2072 ! solution of equation for supersaturation with
2073 ! different DETER values
2076 ! ... only water (start)
2079 IF(ABS(RW*DT)>1.0E-6) THEN
2080 DEL1N=DEL1*EXPR+(DYN1/RW)*(1.0D0-EXPR)
2081 DEL2N=PW*DEL1*EXPR/RW-PW*DYN1*DT/RW- &
2082 PW*DYN1*EXPR/(RW*RW)+DYN2*DT+ &
2083 DEL2-PW*DEL1/RW+PW*DYN1/(RW*RW)
2084 DEL1INT=-DEL1*EXPR/RW+DYN1*DT/RW+ &
2085 DYN1*EXPR/(RW*RW)+DEL1/RW-DYN1/(RW*RW)
2086 DEL2INT=PW*DEL1*EXPR/(-RW*RW)-PW*DYN1*DT*DT/(2.0D0*RW)+ &
2087 PW*DYN1*EXPR/(RW*RW*RW)+DYN2*DT*DT/2.0D0+ &
2088 DEL2*DT-PW*DEL1*DT/RW+PW*DYN1*DT/(RW*RW)+ &
2089 PW*DEL1/(RW*RW)-PW*DYN1/(RW*RW*RW)
2091 ! in case DABS(RW*DT)>1.0D-6
2094 ! in case DABS(RW*DT)<=1.0D-6
2097 DEL1N=DEL1+DEL1*EXPR+(DYN1/RW)*(0.0D0-EXPR)
2098 DEL2N=PW*DEL1*EXPR/RW-PW*DYN1*DT/RW- &
2099 PW*DYN1*EXPR/(RW*RW)+DYN2*DT+DEL2
2100 DEL1INT=-DEL1*EXPR/RW+DYN1*DT/RW+DYN1*EXPR/(RW*RW)
2101 DEL2INT=PW*DEL1*EXPR/(-RW*RW)-PW*DYN1*DT*DT/(2.0D0*RW)+ &
2102 PW*DYN1*EXPR/(RW*RW*RW)+DYN2*DT*DT/2.0D0+ &
2103 DEL2*DT-PW*DEL1*DT/RW+PW*DYN1*DT/(RW*RW)
2107 ! ... only water (end)
2113 ! ... only ice (start)
2117 IF(ABS(PI*DT)>1.0E-6) THEN
2119 DEL2N = DEL2*EXPP+(DYN2/PI)*(1.0D0-EXPP)
2120 DEL2INT = -DEL2*EXPP/PI+DYN2*DT/PI+ &
2121 DYN2*EXPP/(PI*PI)+DEL2/PI-DYN2/(PI*PI)
2122 DEL1N = +RI*DEL2*EXPP/PI-RI*DYN2*DT/PI- &
2123 RI*DYN2*EXPP/(PI*PI)+DYN1*DT+ &
2124 DEL1-RI*DEL2/PI+RI*DYN2/(PI*PI)
2125 DEL1INT = -RI*DEL2*EXPP/(PI*PI)-RI*DYN2*DT*DT/(2.0D0*PI)+ &
2126 RI*DYN2*EXPP/(PI*PI*PI)+DYN1*DT*DT/2.0D0+ &
2127 DEL1*DT-RI*DEL2*DT/PI+RI*DYN2*DT/(PI*PI)+ &
2128 RI*DEL2/(PI*PI)-RI*DYN2/(PI*PI*PI)
2130 ! in case DABS(PI*DT)>1.0D-6
2133 ! in case DABS(PI*DT)<=1.0D-6
2136 DEL2N=DEL2+DEL2*EXPP-EXPP*DYN2/PI
2137 DEL2INT=-DEL2*EXPP/PI+DYN2*DT/PI+DYN2*EXPP/(PI*PI)
2138 DEL1N=+RI*DEL2*EXPP/PI-RI*DYN2*DT/PI- &
2139 RI*DYN2*EXPP/(PI*PI)+DYN1*DT+DEL1
2140 DEL1INT=-RI*DEL2*EXPP/(PI*PI)-RI*DYN2*DT*DT/(2.0D0*PI)+ &
2141 RI*DYN2*EXPP/(PI*PI*PI)+DYN1*DT*DT/2.0D0+ &
2142 DEL1*DT-RI*DEL2*DT/PI+RI*DYN2*DT/(PI*PI)
2146 ! ... only ice (end)
2151 IF(IRW == 1 .AND. IRI == 1) THEN
2153 A=(RW-PI)*(RW-PI)+4.0E0*PW*RI
2156 PRINT*, 'IN SUBROUTINE JERSUPSAT: A < 0'
2159 PRINT*, 'RW,PW,RI,PI'
2160 PRINT 204, RW,PW,RI,PI
2161 PRINT*, 'DT,DYN1,DYN2'
2162 PRINT 203, DT,DYN1,DYN2
2164 PRINT 202, DEL1,DEL2
2165 PRINT*, 'STOP 1905:A < 0'
2166 call wrf_error_fatal("fatal error: STOP 1905:A < 0, model stop")
2168 ! ... water and ice (start)
2169 ALFA=DSQRT((RW-PI)*(RW-PI)+4.0D0*PW*RI)
2171 ! 5/8/04 Nir, Beta is negative to the simple solution so it will decay
2173 BETA=0.5D0*(ALFA+RW+PI)
2174 GAMA=0.5D0*(ALFA-RW-PI)
2176 G32=-PW*DYN1+RW*DYN2
2178 IF (G2 < 1.0d-20) G2 = 1.0004d-11*1.0003d-11-1.0002d-11*1.0001e-11 ! ... (KS) - 24th,May,2016
2182 IF(DABS(GAMA*DT)>1.0E-6) THEN
2183 C11=(BETA*DEL1-RW*DEL1-RI*DEL2-BETA*G31/G2+DYN1)/ALFA
2184 C21=(GAMA*DEL1+RW*DEL1+RI*DEL2-GAMA*G31/G2-DYN1)/ALFA
2185 C12=(BETA*DEL2-PW*DEL1-PI*DEL2-BETA*G32/G2+DYN2)/ALFA
2186 C22=(GAMA*DEL2+PW*DEL1+PI*DEL2-GAMA*G32/G2-DYN2)/ALFA
2187 DEL1N=C11*EXPG+C21*EXPB+G31/G2
2188 DEL1INT=C11*EXPG/GAMA-C21*EXPB/BETA+(C21/BETA-C11/GAMA) &
2190 DEL2N=C12*EXPG+C22*EXPB+G32/G2
2191 DEL2INT=C12*EXPG/GAMA-C22*EXPB/BETA+(C22/BETA-C12/GAMA) &
2194 ! in case DABS(GAMA*DT)>1.0D-6
2196 ! in case DABS(GAMA*DT)<=1.0D-6
2197 IF(ABS(RI/RW)>1.0E-12) THEN
2198 IF(ABS(RW/RI)>1.0E-12) THEN
2199 ALFA=DSQRT((RW-PI)*(RW-PI)+4.0D0*PW*RI)
2200 BETA=0.5D0*(ALFA+RW+PI)
2201 GAMA=0.5D0*(ALFA-RW-PI)
2202 IF (GAMA < 0.5*2.0d-10) GAMA=0.5D0*(2.002d-10-2.001d-10) ! ... (KS) - 24th,May,2016
2206 ! beta/alfa could be very close to 1 that why I transform it
2207 ! remember alfa-beta=gama
2209 C11=(BETA*DEL1-RW*DEL1-RI*DEL2+DYN1)/ALFA
2210 C21=(GAMA*DEL1+RW*DEL1+RI*DEL2-GAMA*G31/G2-DYN1)/ALFA
2211 C12=(BETA*DEL2-PW*DEL1-PI*DEL2+DYN2)/ALFA
2212 C22=(GAMA*DEL2+PW*DEL1+PI*DEL2-GAMA*G32/G2-DYN2)/ALFA
2217 A4DEL1N=G31/G2*(GAMA/ALFA+(GAMA/ALFA-1.0D0)*EXPG)
2219 DEL1N=A1DEL1N+A2DEL1N+A3DEL1N+A4DEL1N
2221 A1DEL1INT=C11*EXPG/GAMA
2222 A2DEL1INT=-C21*EXPB/BETA
2224 A4DEL1INT=G31/G2*DT*(GAMA/ALFA)
2226 DEL1INT=A1DEL1INT+A2DEL1INT+A3DEL1INT+A4DEL1INT
2231 A4DEL2N=G32/G2*(GAMA/ALFA+ &
2232 (GAMA/ALFA-1.0D0)* &
2233 (GAMA*DT+GAMA*GAMA*DT*DT/2.0D0))
2235 DEL2N=A1DEL2N+A2DEL2N+A3DEL2N+A4DEL2N
2237 A1DEL2INT=C12*EXPG/GAMA
2238 A2DEL2INT=-C22*EXPB/BETA
2240 A4DEL2INT=G32/G2*DT*(GAMA/ALFA)
2241 A5DEL2INT=G32/G2*(GAMA/ALFA-1.0D0)* &
2244 DEL2INT=A1DEL2INT+A2DEL2INT+A3DEL2INT+A4DEL2INT+ &
2247 ! in case DABS(RW/RI)>1D-12
2250 ! in case DABS(RW/RI)<=1D-12
2252 X=-2.0D0*RW*PI+RW*RW+4.0D0*PW*RI
2254 ALFA=PI*(1+(X/PI)/2.0D0-(X/PI)*(X/PI)/8.0D0)
2255 BETA=PI+(X/PI)/4.0D0-(X/PI)*(X/PI)/16.0D0+RW/2.0D0
2256 GAMA=(X/PI)/4.0D0-(X/PI)*(X/PI)/16.0D0-RW/2.0D0
2261 C11=(BETA*DEL1-RW*DEL1-RI*DEL2+DYN1)/ALFA
2262 C21=(GAMA*DEL1+RW*DEL1+RI*DEL2-GAMA*G31/G2-DYN1)/ALFA
2263 C12=(BETA*DEL2-PW*DEL1-PI*DEL2+DYN2)/ALFA
2264 C22=(GAMA*DEL2+PW*DEL1+PI*DEL2-GAMA*G32/G2-DYN2)/ALFA
2266 DEL1N=C11+C11*EXPG+C21*EXPB+ &
2267 G31/G2*(GAMA/ALFA+(GAMA/ALFA-1)*EXPG)
2268 DEL1INT=C11*EXPG/GAMA-C21*EXPB/BETA+(C21/BETA)+ &
2269 G31/G2*DT*(GAMA/ALFA)
2270 DEL2N=C12+C12*EXPG+C22*EXPB+G32/G2*(GAMA/ALFA+ &
2271 (GAMA/ALFA-1.0D0)* &
2272 (GAMA*DT+GAMA*GAMA*DT*DT/2.0D0))
2273 DEL2INT=C12*EXPG/GAMA-C22*EXPB/BETA+ &
2274 (C22/BETA)+G32/G2*DT*(GAMA/ALFA)+ &
2275 G32/G2*(GAMA/ALFA-1.0D0)*(GAMA*DT*DT/2.0D0)
2277 ! in case DABS(RW/RI)<=1D-12
2280 ! in case DABS(RI/RW)>1D-12
2284 ! in case DABS(RI/RW)<=1D-12
2286 X=-2.0D0*RW*PI+PI*PI+4.0D0*PW*RI
2288 ALFA=RW*(1.0D0+(X/RW)/2.0D0-(X/RW)*(X/RW)/8.0D0)
2289 BETA=RW+(X/RW)/4.0D0-(X/RW)*(X/RW)/16.0D0+PI/2.0D0
2290 GAMA=(X/RW)/4.0D0-(X/RW)*(X/RW)/16.0D0-PI/2.0D0
2295 C11=(BETA*DEL1-RW*DEL1-RI*DEL2+DYN1)/ALFA
2296 C21=(GAMA*DEL1+RW*DEL1+RI*DEL2-GAMA*G31/G2-DYN1)/ALFA
2297 C12=(BETA*DEL2-PW*DEL1-PI*DEL2+DYN2)/ALFA
2298 C22=(GAMA*DEL2+PW*DEL1+PI*DEL2-GAMA*G32/G2-DYN2)/ALFA
2300 DEL1N=C11+C11*EXPG+C21*EXPB+ &
2301 G31/G2*(GAMA/ALFA+(GAMA/ALFA-1.0D0)*EXPG)
2302 DEL1INT=C11*EXPG/GAMA-C21*EXPB/BETA+(C21/BETA)+ &
2303 G31/G2*DT*(GAMA/ALFA)
2304 DEL2N=C12+C12*EXPG+C22*EXPB+G32/G2* &
2306 (GAMA/ALFA-1.0D0)*(GAMA*DT+GAMA*GAMA*DT*DT/2.0D0))
2307 DEL2INT=C12*EXPG/GAMA-C22*EXPB/BETA+C22/BETA+ &
2308 G32/G2*DT*(GAMA/ALFA)+ &
2309 G32/G2*(GAMA/ALFA-1.0D0)*(GAMA*DT*DT/2.0D0)
2311 ! in case DABS(RI/RW)<=1D-12
2313 ! in case DABS(GAMA*DT)<=1D-6
2316 ! water and ice (end)
2318 ! in case ISYM1/=0.AND.ISYM2/=0
2324 201 FORMAT(1X,D13.5)
2325 202 FORMAT(1X,2D13.5)
2326 203 FORMAT(1X,3D13.5)
2327 204 FORMAT(1X,4D13.5)
2330 END SUBROUTINE JERSUPSAT_KS
2332 ! SUBROUTINE JERSUPSAT
2333 ! ....................................................................
2334 SUBROUTINE JERDFUN_KS (xi,xiN,B21_MY, &
2335 FI2,PSI2,fl2,DEL2N, &
2336 ISYM2,IND,ITYPE,TPN,IDROP, &
2337 FR_LIM,FRH_LIM,ICEMAX,NKR,COL,Ihydro,Iin,Jin,Kin,Itimestep)
2341 INTEGER,INTENT(IN) :: ISYM2, IND, ITYPE, NKR, ICEMAX, Ihydro, Iin, Jin ,Kin, Itimestep
2342 INTEGER,INTENT(INOUT) :: IDROP
2343 REAL(kind=R4SIZE),INTENT(IN) :: B21_MY(:), FI2(:), FR_LIM(:), FRH_LIM(:), &
2345 REAL(kind=R8SIZE),INTENT(IN) :: TPN, xi(:)
2346 REAL(kind=R8SIZE),INTENT(INOUT) :: xiN(:)
2347 REAL(kind=R4SIZE),INTENT(INOUT) :: PSI2(:), FL2(:)
2351 INTEGER :: ITYP, KR, NR, ICE, K, IDSD_Negative
2352 REAL(kind=R8SIZE) :: FL2_NEW(NKR), FI2R(NKR), PSI2R(NKR), C, DEGREE1, DEGREE2, DEGREE3, D, RATEXI, &
2353 B, A, xiR(NKR),xiNR(NKR), FR_LIM_KR
2359 DEGREE1 = 1.0D0/3.0D0
2361 DEGREE3 = 3.0D0/2.0D0
2376 ! new size distribution functions (start)
2379 IF(IND==1 .AND. ITYPE==1) THEN
2380 ! drop diffusional growth
2383 RATExi=C*DEL2N*B21_MY(KR)/D
2392 ! in case IND==1.AND.ITYPE==1
2394 ! in case IND/=1.OR.ITYPE/=1
2396 RATExi = DEL2N*B21_MY(KR)
2397 xiN(KR) = xi(KR) + RATExi
2401 ! recalculation of size distribution functions (start)
2411 (NR,xiR,FI2R,PSI2R,xiNR,ISIGN_3POINT,TPN,IDROP,NKR,COL,IDSD_Negative,Ihydro,Iin,Jin,Kin,Itimestep)
2412 IF(IDSD_Negative == 1)THEN
2413 IF(ISIGN_KO_1 == 1) THEN
2414 ! ... (KS) - we do not use Kovatch-Ouland as separate method
2415 ! CALL JERNEWF_KO_KS &
2416 ! (NR,xiR,FI2R,PSI2R,xiNR,NKR,COL)
2422 FR_LIM_KR=FRH_LIM(KR)
2424 FR_LIM_KR=FR_LIM(KR)
2426 IF(PSI2R(KR)<0.0D0) THEN
2427 PRINT*, 'STOP 1506 : PSI2R(KR)<0.0D0, in JERDFUN_KS'
2428 call wrf_error_fatal("fatal error in PSI2R(KR)<0.0D0, in JERDFUN_KS, model stop")
2430 PSI2(KR) = PSI2R(KR)
2433 ! recalculation of size distribution functions (end)
2436 ! new size distribution functions (end)
2438 201 FORMAT(1X,D13.5)
2439 304 FORMAT(1X,I2,2X,4D13.5)
2442 END SUBROUTINE JERDFUN_KS
2443 ! +----------------------------------------------------------------------------+
2444 SUBROUTINE JERNEWF_KS &
2445 (NRX,RR,FI,PSI,RN,I3POINT,TPN,IDROP,NKR,COL,IDSD_Negative,Ihydro, &
2446 Iin,Jin,Kin,Itimestep)
2450 INTEGER,INTENT(IN) :: NRX, I3POINT, NKR, Ihydro, Iin, Jin, Kin, Itimestep
2451 INTEGER,INTENT(INOUT) :: IDROP, IDSD_Negative
2452 real(kind=R8SIZE),INTENT(IN) :: TPN
2453 real(kind=R4SIZE),INTENT(IN) :: COL
2454 real(kind=R8SIZE),INTENT(INOUT) :: PSI(:), RN(:), FI(:), RR(:)
2458 INTEGER :: KMAX, KR, I, K , NRXP, ISIGN_DIFFUSIONAL_GROWTH, NRX1, &
2459 I3POINT_CONDEVAP, IEvap
2460 real(kind=R8SIZE) :: RNTMP,RRTMP,RRP,RRM,RNTMP2,RRTMP2,RRP2,RRM2, GN1,GN2, &
2461 GN3,GN1P,GMAT,GMAT2, &
2462 CDROP(NRX),DELTA_CDROP(NRX),RRS(NRX+1),PSINEW(NRX+1), &
2463 PSI_IM,PSI_I,PSI_IP, AOLDCON, ANEWCON, AOLDMASS, ANEWMASS
2465 INTEGER,PARAMETER :: KRDROP_REMAPING_MIN = 6, KRDROP_REMAPING_MAX = 12
2468 ! >> [KS] 22ndMay19 IF(TPN .LT. 273.15-5.0D0) IDROP=0
2470 ! INITIAL VALUES FOR SOME VARIABLES
2478 ! RN(I), g - new masses after condensation or evaporation
2479 IF(RN(I) < 0.0D0) THEN
2485 ! new change 26.10.09 (start)
2489 ! new change 26.10.09 (end)
2491 I3POINT_CONDEVAP = I3POINT
2494 IF(RN(1) < RRS(1)) THEN
2496 I3POINT_CONDEVAP = 0
2497 ! new change 26.10.09 (start)
2499 ! new change 26.10.09 (end)
2504 IF(IDROP == 0) I3POINT_CONDEVAP = 0
2506 ! new change 26.10.09 (start)
2511 DELTA_CDROP(K)=0.0D0
2515 RRS(NRXP)=RRS(NRX)*1024.0D0
2517 PSINEW(NRXP) = 0.0D0
2519 ! new change 26.10.09 (end)
2521 ISIGN_DIFFUSIONAL_GROWTH = 0
2524 IF(RN(K).NE.RR(K)) THEN
2525 ISIGN_DIFFUSIONAL_GROWTH = 1
2532 IF(ISIGN_DIFFUSIONAL_GROWTH == 1) THEN
2534 ! Kovetz-Olund method (start)
2536 ! new change 26.10.09 (start)
2537 DO K=1,NRX1 ! ... [KS] >> NRX1-1
2538 ! new change 26.10.09 (end)
2540 IF(FI(K) > 0.0) THEN
2541 IF(DABS(RN(K)-RR(K)) < 1.0D-16) THEN
2542 PSINEW(K) = FI(K)*RR(K)
2547 DO WHILE (.NOT.(RRS(I) <= RN(K) .AND. RRS(I+1) >= RN(K)) &
2548 .AND.I.LT.NRX1) ! [KS] >> was NRX1-1
2552 IF(RN(K).LT.RRS(1)) THEN
2556 GMAT2=(RNTMP-RRTMP)/(RRP-RRTMP)
2557 PSINEW(1)=PSINEW(1)+FI(K)*RR(K)*GMAT2
2563 GMAT2=(RNTMP-RRTMP)/(RRP-RRTMP)
2564 GMAT=(RRP-RNTMP)/(RRP-RRTMP)
2565 PSINEW(I)=PSINEW(I)+FI(K)*RR(K)*GMAT
2566 PSINEW(I+1)=PSINEW(I+1)+FI(K)*RR(K)*GMAT2
2568 ! in case FI(K).NE.0.0D0
2583 ! Kovetz-Olund method (end)
2585 ! calculation both new total drop concentrations(after KO) and new
2586 ! total drop masses (after KO)
2588 ! 3point method (start)
2589 IF(I3POINT_CONDEVAP == 1) THEN
2591 IF(FI(K) > 0.0) THEN
2592 IF(DABS(RN(K)-RR(K)).LT.1.0D-16) THEN
2593 PSI(K) = FI(K)*RR(K)
2597 IF(RRS(2).LT.RN(K)) THEN
2600 (.NOT.(RRS(I) <= RN(K) .AND. RRS(I+1) >= RN(K)) &
2616 GN1=(RRP-RNTMP)*(RRTMP-RNTMP)/(RRP-RRM)/ &
2619 GN1P=(RRP2-RNTMP2)*(RRTMP2-RNTMP2)/ &
2620 (RRP2-RRM2)/(RRTMP2-RRM2)
2622 GN2=(RRP-RNTMP)*(RNTMP-RRM)/(RRP-RRTMP)/ &
2625 GMAT=(RRP-RNTMP)/(RRP-RRTMP)
2627 GN3=(RRTMP-RNTMP)*(RRM-RNTMP)/(RRP-RRM)/ &
2629 GMAT2=(RNTMP-RRTMP)/(RRP-RRTMP)
2631 PSI_IM = PSI(I-1)+GN1*FI(K)*RR(K)
2633 PSI_I = PSI(I)+GN1P*FI(K+1)*RR(K+1)+&
2634 (GN2-GMAT)*FI(K)*RR(K)
2636 PSI_IP = PSI(I+1)+(GN3-GMAT2)*FI(K)*RR(K)
2638 IF(PSI_IM > 0.0D0) THEN
2640 IF(PSI_IP > 0.0D0) THEN
2643 ! smoothing criteria
2644 IF(PSI_IM > PSI(I-2) .AND. PSI_IM < PSI_I &
2645 .AND. PSI(I-2) < PSI(I) .OR. PSI(I-2) >= PSI(I)) THEN
2649 PSI(I) = PSI(I) + FI(K)*RR(K)*(GN2-GMAT)
2652 ! in case smoothing criteria
2657 ! in case PSI_IP.GT.0.0D0
2661 ! in case PSI_IM.GT.0.0D0
2665 ! in case I.LT.NRX1-2
2668 ! in case RRS(2).LT.RN(K)
2671 ! in case FI(K).NE.0.0D0
2679 ! in case I3POINT_CONDEVAP.NE.0
2681 ! 3 point method (end)
2683 ! PSI(K) - new hydrometeor size distribution function
2694 DO K=KRDROP_REMAPING_MIN,KRDROP_REMAPING_MAX
2695 CDROP(K)=3.0D0*COL*PSI(K)*RR(K)
2697 ! KMAX - right boundary spectrum of drop sdf
2698 !(KRDROP_REMAP_MIN =< KMAX =< KRDROP_REMAP_MAX)
2699 DO K=KRDROP_REMAPING_MAX,KRDROP_REMAPING_MIN,-1
2701 IF(PSI(K).GT.0.0D0) GOTO 2011
2705 ! Andrei's new change 28.04.10 (start)
2706 DO K=KMAX-1,KRDROP_REMAPING_MIN,-1
2707 ! Andrei's new change 28.04.10 (end)
2708 IF(CDROP(K).GT.0.0D0) THEN
2709 DELTA_CDROP(K)=CDROP(K+1)/CDROP(K)
2710 IF(DELTA_CDROP(K).LT.COEFF_REMAPING) THEN
2711 CDROP(K)=CDROP(K)+CDROP(K+1)
2717 DO K=KRDROP_REMAPING_MIN,KMAX
2718 PSI(K)=CDROP(K)/(3.0D0*COL*RR(K))
2721 ! in case IDROP.NE.0
2724 ! new change 26.10.09 (end)
2726 ! in case ISIGN_DIFFUSIONAL_GROWTH.NE.0
2728 ! in case ISIGN_DIFFUSIONAL_GROWTH.EQ.0
2735 IF(PSI(KR) < 0.0) THEN ! ... (KS)
2737 print*, "IDSD_Negative=",IDSD_Negative,"kr",kr
2738 PRINT*, 'IN SUBROUTINE JERNEWF'
2740 PRINT*, 'BEFORE EXIT'
2741 PRINT*, 'ISIGN_DIFFUSIONAL_GROWTH'
2742 PRINT*, ISIGN_DIFFUSIONAL_GROWTH
2743 PRINT*, 'I3POINT_CONDEVAP'
2744 PRINT*, I3POINT_CONDEVAP
2745 PRINT*, 'K,RR(K),RN(K),K=1,NRX'
2746 PRINT*, (K,RR(K),RN(K),K=1,NRX)
2747 PRINT*, 'K,RR(K),RN(K),FI(K),PSI(K),K=1,NRX'
2748 PRINT 304, (K,RR(K),RN(K),FI(K),PSI(K),K=1,NRX)
2749 PRINT*, IDROP,Ihydro,Iin,Jin,Kin,Itimestep
2750 call wrf_error_fatal("fatal error in SUBROUTINE JERNEWF PSI(KR)<0, < min, model stop")
2754 304 FORMAT(1X,I2,2X,4D13.5)
2757 END SUBROUTINE JERNEWF_KS
2758 ! +------------------------------------------------------------------+
2759 SUBROUTINE JERDFUN_NEW_KS &
2762 TPN,IDROP,FR_LIM,NKR,COL,Ihydro,Iin,Jin,Kin,Itimestep)
2767 INTEGER,INTENT(INOUT) :: IDROP, NKR
2768 INTEGER,INTENT(IN) :: Ihydro,Iin,Jin,Kin,Itimestep
2769 REAL(kind=R4SIZE),intent(IN) :: FI2(:), B21_MY(:), FR_LIM(:), COL
2770 REAL(kind=R8SIZE), INTENT(IN) :: TPN, xi(:)
2771 REAL(kind=R4SIZE),INTENT(INOUT) :: PSI2(:)
2772 REAL(kind=R8SIZE),INTENT(INOUT) :: xiN(:)
2776 INTEGER :: NR, KR, IDSD_Negative
2777 REAL(kind=R8SIZE) :: C, DEGREE1, DEGREE2, DEGREE3, D, RATEXI, B, A, &
2778 xiR(NKR),FI2R(NKR),PSI2R(NKR),xiNR(NKR)
2794 ! new drop size distribution functions (start)
2796 ! drop diffusional growth
2799 D = xiR(KR)**DEGREE1
2800 ! Andrei's new change of 3.09.10 (start)
2801 ! RATExi=C*DEL2N*B21_MY(KR)/D
2802 RATExi = C*B21_MY(KR)/D
2803 ! Andrei's new change of 3.09.10 (end)
2804 B = xiR(KR)**DEGREE2
2809 xiNR(KR) = A**DEGREE3
2813 ! recalculation of size distribution functions (start)
2817 (NR,xiR,FI2R,PSI2R,xiNR,ISIGN_3POINT,TPN,IDROP,NKR,COL,IDSD_Negative,Ihydro,Iin,Jin,Kin,Itimestep)
2818 IF(IDSD_Negative == 1)THEN
2819 IF(ISIGN_KO_2 == 1) THEN
2820 ! ... (KS) - we do not use Kovatch-Ouland as separate method
2821 ! CALL JERNEWF_KO_KS &
2822 ! (NR,xiR,FI2R,PSI2R,xiNR,NKR,COL)
2828 ! recalculation of drop size distribution functions (end)
2829 ! new drop size distribution functions (end)
2831 201 FORMAT(1X,D13.5)
2834 END SUBROUTINE JERDFUN_NEW_KS
2835 ! +---------------------------------------------------------+
2836 SUBROUTINE Relaxation_Time(TPS,QPS,PP,ROR,DEL1S,DEL2S, &
2837 R1,VR1,FF1in,RLEC,RO1BL, &
2838 R2,VR2,FF2in,RIEC,RO2BL, &
2839 R3,VR3,FF3in,RSEC,RO3BL, &
2840 R4,VR4,FF4in,RGEC,RO4BL, &
2841 R5,VR5,FF5in,RHEC,RO5BL, &
2842 NKR,ICEMAX,COL,DTdyn,NCOND,DTCOND)
2846 integer,intent(in) :: NKR,ICEMAX
2847 integer,intent(out) :: NCOND
2848 real(kind=R4SIZE),intent(in) :: R1(:),FF1in(:),RLEC(:),RO1BL(:), &
2849 R2(:,:),FF2in(:,:),RIEC(:,:),RO2BL(:,:), &
2850 R3(NKR),FF3in(:),RSEC(:),RO3BL(:), &
2851 R4(NKR),FF4in(:),RGEC(:),RO4BL(:), &
2852 R5(NKR),FF5in(:),RHEC(:),RO5BL(:), &
2853 ROR,COL,DTdyn,VR1(:),VR2(:,:),VR3(:),VR4(:),VR5(:)
2854 real(kind=R8SIZE),intent(in) :: TPS,QPS,PP,DEL1S,DEL2S
2855 real(kind=R4SIZE),intent(out) :: DTCOND
2858 integer :: ISYM1, ISYM2(ICEMAX), ISYM3, ISYM4, ISYM5, ISYM_SUM, ICM
2859 real(kind=R8SIZE),parameter :: AA1_MY = 2.53D12, BB1_MY = 5.42D3, AA2_MY = 3.41D13, &
2860 BB2_MY = 6.13E3, AL1 = 2500.0, AL2 = 2834.0
2861 real(kind=R8SIZE),parameter :: TAU_Min = 0.1 ! [s]
2862 real(kind=R8SIZE) :: OPER2, AR1, TAU_RELAX, B5L, B5I, &
2863 R1D(NKR), R2D(NKR,ICEMAX), R3D(NKR), R4D(NKR), R5D(NKR), &
2864 VR1_d(nkr),VR2_d(nkr,icemax),VR3_d(nkr),VR4_d(nkr),VR5_d(nkr)
2865 real(kind=R4SIZE) :: B11_MY(NKR), B21_MY(NKR,ICEMAX), B31_MY(NKR), &
2866 B41_MY(NKR), B51_MY(NKR), FL1(NKR), FL3(NKR), FL4(NKR), FL5(NKR), &
2867 SFNDUMMY(3), SFN11, SFNI1(ICEMAX), SFNII1, SFN21, SFN31, SFN41, SFN51, SFNI, SFNL, B8L, B8I, RI, PW, &
2868 DOPL, DOPI, TAU_w, TAU_i, phi, RW, PI
2871 OPER2(AR1)=0.622/(0.622+0.378*AR1)/AR1
2884 IF(sum(FF1in) > 0.0) ISYM1 = 1
2885 IF(sum(FF2in(:,1)) > 1.0D-10) ISYM2(1) = 1
2886 IF(sum(FF2in(:,2)) > 1.0D-10) ISYM2(2) = 1
2887 IF(sum(FF2in(:,3)) > 1.0D-10) ISYM2(3) = 1
2888 IF(sum(FF3in) > 1.0D-10) ISYM3 = 1
2889 IF(sum(FF4in) > 1.0D-10) ISYM4 = 1
2890 IF(sum(FF5in) > 1.0D-10) ISYM5 = 1
2892 ISYM_SUM = ISYM1 + sum(ISYM2) + ISYM3 + ISYM4 + ISYM5
2893 IF(ISYM_SUM == 0)THEN
2895 NCOND = nint(DTdyn/TAU_RELAX)
2923 CALL JERRATE_KS(R1D,TPS,PP,VR1_d,RLEC,RO1BL,B11_MY,1,1,fl1,NKR,ICEMAX)
2925 CALL JERTIMESC_KS(FF1in,R1D,SFNDUMMY,B11_MY,B8I,1,NKR,ICEMAX,COL)
2929 !IF(sum(ISYM2) > 0) THEN
2931 ! ! ... ice crystals
2932 ! CALL JERRATE_KS (R2D,TPS,PP,VR2_d,RIEC,RO2BL,B21_MY,3,2,fl1,NKR,ICEMAX)
2933 ! CALL JERTIMESC_KS (FF2in,R2D,SFNI1,B21_MY,B8I,ICM,NKR,ICEMAX,COL)
2939 CALL JERRATE_KS (R3D,TPS,PP,VR3_d,RSEC,RO3BL,B31_MY,1,3,fl3,NKR,ICEMAX)
2941 CALL JERTIMESC_KS(FF3in,R3D,SFNDUMMY,B31_MY,B8I,1,NKR,ICEMAX,COL)
2948 CALL JERRATE_KS(R4D,TPS,PP,VR4_d,RGEC,RO4BL,B41_MY,1,2,fl4,NKR,ICEMAX)
2951 CALL JERTIMESC_KS(FF4in,R4D,SFNDUMMY,B41_MY,B8I,1,NKR,ICEMAX,COL)
2958 CALL JERRATE_KS(R5D,TPS,PP,VR5_d,RHEC,RO5BL,B51_MY,1,2,fl5,NKR,ICEMAX)
2961 CALL JERTIMESC_KS(FF5in,R5D,SFNDUMMY,B51_MY,B8I,1,NKR,ICEMAX,COL)
2971 SFNII1 = SFNI1(1)+SFNI1(2)+SFNI1(3)
2972 SFN21 = SFNII1 + SFN31 + SFN41 + SFN51
2973 SFNL = SFN11 ! Liquid
2974 SFNI = SFN21 ! Total Ice
2980 RW=(OPER2(QPS)+B5L*AL1)*DOPL*SFNL
2981 RI=(OPER2(QPS)+B5L*AL2)*DOPL*SFNI
2982 PW=(OPER2(QPS)+B5I*AL1)*DOPI*SFNL
2983 PI=(OPER2(QPS)+B5I*AL2)*DOPI*SFNI
2987 phi = (1.0 + DEL2S)/(1.0 + DEL1S)
2988 if(PW > 0.0 .or. PI > 0.0) TAU_w = (PW + phi*PI)**(-1.0)
2989 if(RW > 0.0 .or. RI > 0.0) TAU_i = phi/(RW + RI*phi)
2991 IF(PW > 0.0 .or. RI > 0.0) TAU_RELAX = (PW + RI)**(-1.0)/3.0
2992 IF(PW > 0.0 .and. RI > 0.0) TAU_RELAX = min(TAU_w,TAU_i)/3.0
2994 if(TAU_RELAX > DTdyn) TAU_RELAX = DTdyn/3.0
2995 if(TAU_RELAX < TAU_Min) TAU_RELAX = TAU_Min
2996 IF(PW <= 0.0 .and. RI <= 0.0) TAU_RELAX = DTdyn
2998 !if(TAU_RELAX < DTdyn .and. IDebug_Print_DebugModule==1)then
2999 ! print*,"in Relaxation_Time,TAU_RELAX < DTdyn"
3003 !NCOND = nint(DTdyn/TAU_RELAX)
3004 NCOND = ceiling(DTdyn/TAU_RELAX)
3008 END SUBROUTINE Relaxation_Time
3009 ! +------------------------------+
3010 end module module_mp_SBM_Auxiliary
3011 ! +-----------------------------------------------------------------------------+
3012 ! +-----------------------------------------------------------------------------+
3013 module module_mp_SBM_Nucleation
3015 USE module_mp_SBM_Auxiliary,ONLY:POLYSVP
3018 public JERNUCL01_KS, LogNormal_modes_Aerosol
3021 INTEGER, PARAMETER, PRIVATE:: R8SIZE = 8
3022 INTEGER, PARAMETER, PRIVATE:: R4SIZE = 4
3024 INTEGER,PARAMETER :: Use_cloud_base_nuc = 1
3025 real(kind=r8size),PARAMETER::T_NUCL_DROP_MIN = -80.0D0
3026 real(kind=r8size),PARAMETER::T_NUCL_ICE_MIN = -37.0D0
3027 ! Ice nucleation method
3028 ! using MEYERS method : ice_nucl_method == 0
3029 ! using DE_MOTT method : ice_nucl_method == 1
3030 INTEGER,PARAMETER :: ice_nucl_method = 0
3031 INTEGER,PARAMETER :: ISIGN_TQ_ICENUCL = 1
3033 DOUBLE PRECISION,PARAMETER::DELSUPICE_MAX = 59.0D0
3036 ! +-----------------------------------------------------------------------------+
3037 SUBROUTINE JERNUCL01_KS(PSI1_r, PSI2_r, FCCNR_r, &
3038 XL_r, XI_r, TT, QQ, &
3042 SUP2_OLD_r, DSUPICE_XYZ_r, &
3043 RCCN_r, DROPRADII_r, NKR, NKR_aerosol, ICEMAX, ICEPROCS, &
3044 Win_r, Is_This_CloudBase, RO_SOLUTE, IONS, MWAERO, &
3050 integer,intent(in) :: Kin, Jin, Iin, NKR, NKR_aerosol, ICEMAX, ICEPROCS, Is_This_CloudBase,IONS
3051 real(kind=r4size),intent(in) :: XL_r(:), XI_r(:,:), ROR_r, PP_r, COL_r, Win_r, &
3052 SUP2_OLD_r, DSUPICE_XYZ_r, RCCN_r(:), DROPRADII_r(:)
3053 real(kind=r4size),intent(in) :: MWAERO, RO_SOLUTE
3054 real(kind=r4size),intent(inout) :: PSI1_r(:),PSI2_r(:,:),FCCNR_r(:)
3055 real(kind=r8size),intent(inout) :: TT, QQ, SUP1,SUP2
3058 integer :: KR, ICE, K
3059 real(kind=r8size) :: DROPCONCN(NKR), ARG_1, COL3, RORI, TPN, QPN, TPC, AR1, AR2, OPER3, &
3060 SUM_ICE, DEL2N, FI2(NKR,ICEMAX), TFREEZ_OLD, DTFREEZXZ, RMASSIAA_NUCL, RMASSIBB_NUCL, &
3061 FI2_K, xi_K, FI2R2, DELMASSICE_NUCL, ES1N, ES2N, EW1N
3062 real(kind=r8size),parameter :: AL2 = 2834.0D0
3063 real(kind=r8size) :: PSI1(NKR),PSI2(NKR,ICEMAX),FCCNR(NKR_aerosol),ROR,XL(NKR),XI(NKR,ICEMAX),PP,COL, &
3064 SUP2_OLD,DSUPICE_XYZ,Win, RCCN(NKR_aerosol),DROPRADII(NKR)
3065 real(kind=r4size) :: TPNreal
3068 OPER3(AR1,AR2) = AR1*AR2/(0.622D0+0.378D0*AR1)
3070 ! ... Adjust the Imput
3079 SUP2_OLD = SUP2_OLD_r
3080 DSUPICE_XYZ = DSUPICE_XYZ_r
3082 DROPRADII = DROPRADII_r
3088 ! ... Drop Nucleation (start)
3094 IF(SUP1>0.0D0 .AND. TPC>T_NUCL_DROP_MIN) THEN
3095 if(sum(FCCNR) > 0.0)then
3097 CALL WATER_NUCLEATION (COL, NKR_aerosol, PSI1, FCCNR, xl, TT, QQ, ROR, SUP1, DROPCONCN, &
3098 PP, Is_This_CloudBase, Win, RO_SOLUTE, RCCN, IONS,MWAERO)
3100 ! ... Transfer drops to Ice-Crystals via direct homogenous nucleation
3101 IF(TPC <= -38.0D0) THEN
3104 PSI2(KR,2) = PSI2(KR,2) + PSI1(KR)
3105 SUM_ICE = SUM_ICE + COL3*xl(KR)*xl(KR)*PSI1(KR)
3108 ARG_1 = 334.0D0*SUM_ICE*RORI
3112 ! ... Drop nucleation (end)
3113 ! ... Nucleation of crystals (start)
3114 DEL2N = 100.0D0*SUP2
3117 IF(TPC < 0.0D0 .AND. TPC >= T_NUCL_ICE_MIN .AND. DEL2N > 0.0D0) THEN
3121 FI2(KR,ICE)=PSI2(KR,ICE)
3125 if(ice_nucl_method == 0) then
3126 CALL ICE_NUCL (PSI2,xi,SUP2,TT,DSUPICE_XYZ,SUP2_OLD,ICEMAX,NKR,COL)
3129 IF(ISIGN_TQ_ICENUCL == 1) THEN
3133 ! before ice crystal nucleation
3138 FI2R2=FI2_K*xi_K*xi_K
3139 RMASSIBB_NUCL=RMASSIBB_NUCL+FI2R2
3143 RMASSIBB_NUCL = RMASSIBB_NUCL*COL3*RORI
3145 IF(RMASSIBB_NUCL < 0.0D0) RMASSIBB_NUCL = 0.0D0
3147 ! after ice crystal nucleation
3152 FI2R2=FI2_K*xi_K*xi_K
3153 RMASSIAA_NUCL=RMASSIAA_NUCL+FI2R2
3157 RMASSIAA_NUCL = RMASSIAA_NUCL*COL3*RORI
3159 IF(RMASSIAA_NUCL < 0.0D0) RMASSIAA_NUCL=0.0D0
3161 DELMASSICE_NUCL = RMASSIAA_NUCL-RMASSIBB_NUCL
3163 QPN = QQ-DELMASSICE_NUCL
3166 TPN = TT + AL2*DELMASSICE_NUCL
3170 ES1N = POLYSVP(TPNreal,0)
3171 ES2N = POLYSVP(TPNreal,1)
3173 EW1N = OPER3(QPN,PP)
3175 SUP1 = EW1N/ES1N-1.0D0
3176 SUP2 = EW1N/ES2N-1.0D0
3178 ! in case ISIGN_TQ_ICENUCL/=0
3181 ! in case TPC<0.AND.TPC>=T_NUCL_ICE_MIN.AND.DEL2N>0.D0
3184 ! ... Nucleation of crystals (end)
3192 END SUBROUTINE JERNUCL01_KS
3193 ! +-------------------------------------------------------------------------------------------------------------------------+
3194 SUBROUTINE WATER_NUCLEATION (COL, NKR, PSI1, FCCNR, xl, TT, QQ, ROR, SUP1, &
3195 DROPCONCN, PP, Is_This_CloudBase, Win, RO_SOLUTE, &
3198 !===================================================================!
3200 ! DROP NUCLEATION SCHEME !
3202 ! Authors: Khain A.P. & Pokrovsky A.G. July 2002 at Huji, Israel !
3204 !===================================================================!
3207 ! PSI1(KR), 1/g/cm3 - non conservative drop size distribution function
3208 ! FCCNR(KR), 1/cm^3 - aerosol(CCN) non conservative, size distribution function
3209 ! xl((KR), g - drop bin masses
3211 integer,intent(in) :: Is_This_CloudBase, NKR, IONS
3212 real(kind=r8size),intent(in) :: xl(:), ROR, PP, Win, RCCN(:), COL
3213 real(kind=r8size),intent(inout) :: FCCNR(:), PSI1(:), DROPCONCN(:), QQ, TT, SUP1
3214 real(kind=r4size),intent(in) :: RO_SOLUTE, MWAERO
3217 integer :: IMAX, I, NCRITI, KR
3218 real(kind=r8size) :: DX,AR2,RCRITI,DEG01,RORI,CCNCONC(NKR),AKOE,BKOE, AR1, OPER3, RCCN_MINIMUM, &
3219 DLN1, DLN2, RMASSL_NUCL, ES1N, EW1N
3220 real(kind=r8size),parameter :: AL1 = 2500.0D0
3221 real(kind=r4size) :: TTreal
3224 OPER3(AR1,AR2)=AR1*AR2/(0.622D0+0.378D0*AR1)
3226 DROPCONCN(:) = 0.0D0
3233 ! imax - right CCN spectrum boundary
3236 IF(FCCNR(I) > 0.0D0) THEN
3243 ! every iteration we will nucleate one bin, then we will check the new supersaturation
3245 do while (IMAX>=NCRITI)
3248 ! akoe & bkoe - constants in Koehler equation
3250 !BKOE=2.0D0*4.3D0/(22.9D0+35.5D0)
3251 BKOE = ions*4.3/mwaero
3252 BKOE=BKOE*(4.0D0/3.0D0)*3.141593D0*RO_SOLUTE
3254 if(Use_cloud_base_nuc == 1) then
3255 if(Is_This_CloudBase == 1) then
3256 CALL Cloud_Base_Super (FCCNR, RCCN, TT, PP, Win, NKR, RCRITI, RO_SOLUTE, IONS, MWAERO, COL)
3258 ! rcriti, cm - critical radius of "dry" aerosol
3259 RCRITI = (AKOE/3.0D0)*(4.0D0/BKOE/SUP1/SUP1)**DEG01
3261 else ! ismax_cloud_base==0
3262 ! rcriti, cm - critical radius of "dry" aerosol
3263 RCRITI=(AKOE/3.0D0)*(4.0D0/BKOE/SUP1/SUP1)**DEG01
3266 IF(RCRITI >= RCCN(IMAX)) EXIT ! nothing to nucleate
3268 ! find the minimum bin to nucleate
3270 do while (RCRITI<=RCCN(NCRITI) .and. NCRITI>1)
3274 ! rccn_minimum - minimum aerosol(ccn) radius
3275 RCCN_MINIMUM = RCCN(1)/10000.0D0
3276 ! calculation of ccnconc(ii)=fccnr(ii)*col - aerosol(ccn) bin
3279 ! determination of ncriti - number bin in which is located rcriti
3280 ! calculation of ccnconc(ncriti)=fccnr(ncriti)*dln1/(dln1+dln2),
3282 ! dln1=Ln(rcriti)-Ln(rccn_minimum)
3283 ! dln2=Ln(rccn(1)-Ln(rcriti)
3284 ! calculation of new value of fccnr(ncriti)
3286 ! each iteration we nucleate the last bin
3287 IF (NCRITI==IMAX-1) then
3289 DLN1=DLOG(RCRITI)-DLOG(RCCN(IMAX-1))
3291 CCNCONC(IMAX)=DLN2*FCCNR(IMAX)
3292 FCCNR(IMAX)=FCCNR(IMAX)*DLN1/COL
3294 DLN1=DLOG(RCRITI)-DLOG(RCCN_MINIMUM)
3295 DLN2=DLOG(RCCN(1))-DLOG(RCRITI)
3296 CCNCONC(IMAX)=DLN2*FCCNR(IMAX)
3297 FCCNR(IMAX)=FCCNR(IMAX)*DLN1/(DLN1+DLN2)
3300 CCNCONC(IMAX) = COL*FCCNR(IMAX)
3304 ! calculate the mass change due to nucleation
3306 if (IMAX <= NKR-7) then ! we pass it to drops mass grid
3307 DROPCONCN(1) = DROPCONCN(1)+CCNCONC(IMAX)
3308 RMASSL_NUCL = RMASSL_NUCL+CCNCONC(IMAX)*XL(1)*XL(1)
3310 DROPCONCN(8-(NKR-IMAX)) = DROPCONCN(8-(NKR-IMAX))+CCNCONC(IMAX)
3311 RMASSL_NUCL = RMASSL_NUCL + CCNCONC(IMAX)*XL(8-(NKR-IMAX))*XL(8-(NKR-IMAX))
3313 RMASSL_NUCL = RMASSL_NUCL*COL*3.0*RORI
3315 ! prepering to check if we need to nucleate the next bin
3318 ! cycle IMAX>=NCRITI
3321 ! ... Intergarting for including the previous nucleated drops
3322 IF(sum(DROPCONCN) > 0.0)THEN
3324 DX = 3.0D0*COL*xl(KR)
3325 PSI1(KR) = PSI1(KR)+DROPCONCN(KR)/DX
3330 END SUBROUTINE WATER_NUCLEATION
3331 ! +--------------------------------------------------------------------------+
3332 !====================================================================!
3334 ! ICE NUCLEATION SCHEME !
3336 ! Authors: Khain A.P. & Pokrovsky A.G. July 2002 at Huji, Israel !
3338 !====================================================================!
3340 SUBROUTINE ICE_NUCL (PSI2,xi,SUP2,TT,DSUPICE_XYZ,SUP2_OLD,ICEMAX,NKR,COL)
3344 integer,intent(in) :: NKR, ICEMAX
3345 real(kind=r8size),intent(in) :: xi(:,:), DSUPICE_XYZ, COL
3346 real(kind=r8size),intent(inout) :: PSI2(:,:),TT,SUP2,SUP2_OLD
3349 integer :: KR,ICE,ITYPE
3350 real(kind=r8size) :: FI2(NKR,ICEMAX), CONCI_BFNUCL(ICEMAX), CONCI_AFNUCL(ICEMAX)
3351 real(kind=r8size),parameter :: A1 = -0.639D0, B1 = 0.1296D0, A2 = -2.8D0, B2 = 0.262D0, &
3352 TEMP1 = -5.0D0, TEMP2 = -2.0D0, TEMP3 = -20.0D0
3354 ! C1_MEY=0.001 1/cm^3
3355 real(kind=r8size),PARAMETER::C1_MEY = 1.0D-3
3356 real(kind=r8size),PARAMETER::C2_MEY = 0.0D0
3357 INTEGER,PARAMETER :: NRGI = 2
3358 real(kind=r8size) :: C1,C2,TPC,DEL2N,DEL2NN,HELEK1,HELEK2,FF1BN,FACT,DSUP2N,DELTACD,DELTAF, &
3359 ADDF,DELCONCI_AFNUCL,TPCC,DX
3365 ! size distribution functions of crystals before ice nucleation
3369 FI2(KR,ICE)=PSI2(KR,ICE)
3373 ! calculation concentration of crystals before ice nucleation
3376 CONCI_BFNUCL(ICE)=0.0D0
3378 CONCI_BFNUCL(ICE)=CONCI_BFNUCL(ICE)+ &
3379 3.0D0*COL*PSI2(KR,ICE)*xi(KR,ICE)
3383 ! type of ice with nucleation (start)
3388 IF((TPC>-4.0D0).OR.(TPC<=-8.1D0.AND.TPC>-12.7D0).OR. &
3389 (TPC<=-17.8D0.AND.TPC>-22.4D0)) THEN
3392 IF((TPC<=-4.0D0.AND.TPC>-8.1D0) &
3393 .OR.(TPC<=-22.4D0)) THEN
3400 ! type of ice with nucleation (end)
3402 ! new crystal size distribution function (start)
3404 IF (TPC < TEMP1) THEN
3405 DEL2N = 100.0D0*SUP2
3407 IF( DEL2N > DELSUPICE_MAX) DEL2NN = DELSUPICE_MAX
3408 HELEK1 = C1*DEXP(A1+B1*DEL2NN)
3413 IF(TPC < TEMP2) THEN
3415 IF(TPCC < TEMP3) TPCC = TEMP3
3416 HELEK2 = C2*DEXP(A2-B2*TPCC)
3421 FF1BN = HELEK1+HELEK2
3423 DSUP2N = (SUP2-SUP2_OLD+DSUPICE_XYZ)*100.0D0
3424 SUP2_OLD = SUP2 ! ### (KS) : We calculate SUP2_OLD outside of JERNUCL01
3426 IF(DSUP2N > DELSUPICE_MAX) DSUP2N = DELSUPICE_MAX
3428 DELTACD = FF1BN*B1*DSUP2N
3430 IF(DELTACD>=FF1BN) DELTACD=FF1BN
3432 IF(DELTACD>0.0D0) THEN
3434 ! concentration of ice crystals
3435 if(CONCI_BFNUCL(ICE)<=helek1) then
3437 DX=3.0D0*xi(KR,ICE)*COL
3439 PSI2(KR,ICE)=PSI2(KR,ICE)+ADDF
3444 ! calculation of crystal concentration after ice nucleation
3447 CONCI_AFNUCL(ICE)=0.0D0
3449 CONCI_AFNUCL(ICE)=CONCI_AFNUCL(ICE)+ &
3450 3.0D0*COL*PSI2(KR,ICE)*xi(KR,ICE)
3452 DELCONCI_AFNUCL=DABS(CONCI_AFNUCL(ICE)-CONCI_BFNUCL(ICE))
3453 IF(DELCONCI_AFNUCL>10.0D0) THEN
3454 PRINT*, 'IN SUBROUTINE ICE_NUCL, AFTER NUCLEATION'
3455 PRINT*, 'BECAUSE DELCONCI_AFNUCL > 10/cm^3'
3456 PRINT*, 'CONCI_BFNUCL(ICE),CONCI_AFNUCL(ICE)'
3457 PRINT 202, CONCI_BFNUCL(ICE),CONCI_AFNUCL(ICE)
3458 PRINT*, 'DELTACD,DSUP2N,FF1BN,B1,DSUPICEXZ,SUP2'
3459 PRINT 206, DELTACD,DSUP2N,FF1BN,B1,DSUPICE_XYZ,SUP2
3460 PRINT*, 'KR, FI2(KR,ICE), PSI2(KR,ICE), KR=1,NKR'
3461 PRINT 302, (KR, FI2(KR,ICE), PSI2(KR,ICE), KR=1,NKR)
3462 PRINT*, 'STOP 099 : DELCONCI_AFNUCL(ICE) > 10/cm^3'
3467 ! new crystal size distribution function (end)
3470 202 FORMAT(1X,2D13.5)
3471 206 FORMAT(1X,6D13.5)
3472 302 FORMAT(1X,I2,2X,2D13.5)
3475 END SUBROUTINE ICE_NUCL
3477 ! SUBROUTINE ICE_NUCL
3478 ! +-------------------------------------------------------------------------------------------------+
3479 SUBROUTINE Cloud_Base_Super (FCCNR, RCCN, TT, PP, Wbase, NKR, RCRITI, RO_SOLUTE, IONS, MWAERO, &
3484 ! RCCN(NKR), cm- aerosol's radius
3486 ! FCCNR(KR), 1/cm^3 - aerosol(CCN) non conservative, size
3487 ! distribution function in point with X,Z
3488 ! coordinates, KR=1,...,NKR
3489 integer,intent(in) :: NKR, IONS
3490 real(kind=r8size),intent(in) :: TT, PP, Wbase, RCCN(:), COL
3491 real(kind=r8size),intent(inout) :: FCCNR(:), RCRITI
3492 real(kind=r4size),intent(in) :: MWAERO, RO_SOLUTE
3495 integer :: NR, NN, KR
3496 real(kind=r8size) :: PL(NKR), supmax(NKR), AKOE, BKOE, C3, PR, CCNCONACT, DL1, DL2, &
3500 CALL supmax_COEFF(AKOE,BKOE,C3,PP,TT,RO_SOLUTE,IONS,MWAERO)
3502 ! supmax calculation
3504 ! 'Analytical estimation of droplet concentration at cloud base', eq.21, 2012
3505 ! calculation of right side hand of equation for S_MAX
3506 ! while wbase>0, calculation PR
3508 PR = C3*wbase**(0.75D0)
3510 ! calculation supersaturation in cloud base
3516 supmax(NR)=DSQRT((4.0D0*AKOE**3.0D0)/(27.0D0*RCCN(NR)**3.0D0*BKOE))
3517 ! calculation CCNCONACT- the concentration of ccn that were activated
3518 ! following nucleation
3519 ! CCNCONACT=N from the paper
3520 ! 'Analytical estimation of droplet concentration at cloud base', eq.19, 2012
3521 ! CCNCONACT, 1/cm^3- concentration of activated CCN = new droplet concentration
3522 ! CCNCONACT=FCCNR(KR)*COL
3527 ! NR represents the number of bin in which rcriti is located
3528 ! from NR bin to NKR bin goes to droplets
3531 CCNCONACT = CCNCONACT + COL*FCCNR(KR)
3534 ! calculate LHS of equation for S_MAX
3535 ! when PL<PR ccn will activate
3537 PL(NR)=supmax(NR)*(DSQRT(CCNCONACT))
3538 IF(PL(NR).LE.PR) THEN
3546 print*,"PR, Wbase [cm/s], C3",PR,wbase,C3
3548 CALL wrf_error_fatal ( 'NN is not defined in cloud base routine, model stop' )
3551 ! linear interpolation- finding radius criti of aerosol between
3552 ! bin number (nn-1) to (nn)
3553 ! 1) finding the difference between pl and pr in the left and right over the
3556 DL1 = dabs(PL(NN-1)-PR) ! left side in the final bin
3557 DL2 = dabs(PL(NN)-PR) ! right side in the final bin
3559 ! 2) fining the left part of bin that will not activate
3560 ! DLN1=COL*DL1/(DL2+DL1)
3561 ! 3)finding the right part of bin that activate
3563 ! 4)finding radius criti of aerosol- RCRITI
3565 RCRITI = RCCN(NN-1)*dexp(COL*DL1/(DL1+DL2))
3567 ! end linear interpolation
3570 END SUBROUTINE Cloud_Base_Super
3571 ! +-------------------------------------------------------------------+
3572 SUBROUTINE supmax_COEFF (AKOE,BKOE,C3,PP,TT,RO_SOLUTE,IONS,MWAERO)
3576 ! akoe, cm- constant in Koehler equation
3577 ! bkoe - constant in Koehler equation
3578 ! F, cm^-2*s- from Koehler equation
3579 ! C3 - coefficient depends on thermodynamical parameters
3580 ! PP, (DYNES/CM/CM)- PRESSURE
3581 ! TT, (K)- temperature
3583 integer,intent(in) :: IONS
3584 real(kind=r8size) ,intent(in) :: PP, TT
3585 real(kind=r8size) ,intent(out) :: AKOE, BKOE, C3
3586 real,intent(in) :: MWAERO, RO_SOLUTE
3589 real(kind=r8size) ,parameter :: RV_MY = 461.5D4, CP = 1005.0D4, G = 9.8D2, RD_MY = 287.0D4, & ![cgs]
3591 real(kind=r8size) :: PZERO,TZERO,ALW1,SW,RO_W,HC,EW,RO_V,DV,RO_A,FL,FR,F,TPC,QV,A1,A2, &
3598 ! RV_MY, CM*CM/SEC/SEC/KELVIN - INDIVIDUAL GAS CONSTANT
3602 ! CP, CM*CM/SEC/SEC/KELVIN- SPECIFIC HEAT CAPACITY OF
3603 ! MOIST AIR AT CONSTANT PRESSURE
3606 ! G, CM/SEC/SEC- ACCELERATION OF GRAVITY
3609 ! RD_MY, CM*CM/SEC/SEC/KELVIN - INDIVIDUAL GAS CONSTANT
3613 ! AL2_MY, CM*CM/SEC/SEC - LATENT HEAT OF SUBLIMATION
3617 ! PZERO, DYNES/CM/CM - REFERENCE PRESSURE
3620 ! TZERO, KELVIN - REFERENCE TEMPERATURE
3623 ! AL1_MY, CM*CM/SEC/SEC - LATENT HEAT OF VAPORIZATION
3624 ! ALW1=AL1_MY - ALW1 depends on temperature
3625 ! ALW1, [m^2/sec^2] -latent heat of vaporization-
3627 ALW1 = -6.143419998D-2*tpc**(3.0D0)+1.58927D0*tpc**(2.0D0) &
3628 -2.36418D3*tpc+2.50079D6
3629 ! ALW1, [cm^2/sec^2]
3633 ! Sw, [N*m^-1] - surface tension of water-air interface
3635 IF(tpc.LT.-5.5D0) THEN
3636 Sw = 5.285D-11*tpc**(6.0D0)+6.283D-9*tpc**(5.0D0)+ &
3637 2.933D-7*tpc**(4.0D0)+6.511D-6*tpc**(3.0D0)+ &
3638 6.818D-5*tpc**(2.0D0)+1.15D-4*tpc+7.593D-2
3640 Sw = -1.55D-4*tpc+7.566165D-2
3646 ! RO_W, [kg/m^3] - density of liquid water
3647 IF (tpc.LT.0.0D0) THEN
3648 RO_W= -7.497D-9*tpc**(6.0D0)-3.6449D-7*tpc**(5.0D0) &
3649 -6.9987D-6*tpc**(4.0D0)+1.518D-4*tpc**(3.0D0) &
3650 -8.486D-3*tpc**(2.0D0)+6.69D-2*tpc+9.9986D2
3654 RO_W=(-3.932952D-10*tpc**(5.0D0)+1.497562D-7*tpc**(4.0D0) &
3655 -5.544846D-5*tpc**(3.0D0)-7.92221D-3*tpc**(2.0D0)+ &
3656 1.8224944D1*tpc+9.998396D2)/(1.0D0+1.8159725D-2*tpc)
3662 ! HC, [kg*m/kelvin*sec^3] - coefficient of air heat conductivity
3663 HC=7.1128D-5*tpc+2.380696D-2
3665 ! HC, [g*cm/kelvin*sec^3]
3668 ! ew, water vapor pressure ! ... KS (kg/m2/sec)
3670 ew = 6.38780966D-9*tpc**(6.0D0)+2.03886313D-6*tpc**(5.0D0)+ &
3671 3.02246994D-4*tpc**(4.0D0)+2.65027242D-2*tpc**(3.0D0)+ &
3672 1.43053301D0*tpc**(2.0D0)+4.43986062D1*tpc+6.1117675D2
3678 ! akoe & bkoe - constants in Koehler equation
3681 AKOE=2.0D0*Sw/(RV_MY*RO_W*(tpc+TZERO))
3682 !BKOE=2.0D0*4.3D0/(22.9D0+35.5D0)
3683 BKOE = ions*4.3/mwaero
3684 BKOE=BKOE*(4.0D0/3.0D0)*pi*RO_SOLUTE
3686 ! RO_V, g/cm^3 - density of water vapor
3687 ! calculate from equation of state for water vapor
3688 RO_V = ew/(RV_MY*(tpc+TZERO))
3690 ! DV, [cm^2/sec] - coefficient of diffusion
3692 ! 'Pruppacher, H.R., Klett, J.D., 1997. Microphysics of Clouds and Precipitation'
3693 ! 'page num 503, eq. 13-3'
3694 DV = 0.211D0*(PZERO/PP)*((tpc+TZERO)/TZERO)**(1.94D0)
3696 ! QV, g/g- water vapor mixing ratio
3697 ! ro_a, g/cm^3 - density of air, from equation of state
3698 RO_A=PZERO/((tpc+TZERO)*RD_MY)
3700 ! F, s/m^2 - coefficient depending on thermodynamics parameters
3701 ! such as temperature, thermal conductivity
3703 ! left side of F equation
3704 FL=(RO_W*ALW1**(2.0D0))/(HC*RV_MY*(tpc+TZERO)**(2.0D0))
3706 ! right side of F equation
3707 FR = RO_W*RV_MY*(tpc+TZERO)/(ew*DV)
3710 ! QV, g/g - water vapor mixing ratio
3713 ! A1,A2 - terms from equation describing changes of
3714 ! supersaturation in an adiabatic cloud air
3716 ! A1, [cm^-1] - constant
3717 ! A2, [-] - constant
3719 A1=(G*ALW1/(CP*RV_MY*(tpc+TZERO)**(2.0D0)))-(G/(RD_MY*(tpc+TZERO)))
3720 A2=(1.0D0/QV)+(ALW1**(2.0D0))/(CP*RV_MY*(tpc+TZERO)**(2.0D0))
3722 ! C1,C2,C3,C4- constant parameters
3728 C3=C1*(F*A1/3.0D0)**(0.75D0)*DSQRT(3.0D0*RO_A/(4.0D0*pi*RO_W*A2))
3729 !C4=(C2-C1)**(DEG01)*(F*A1/3.0D0)**(0.25D0)*RO_A**(DEG02)* &
3730 ! DSQRT(3.0D0/(4.0D0*pi*RO_W*A2))
3733 END SUBROUTINE SupMax_COEFF
3734 ! +----------------------------------------------------------------------------------------------------+
3735 SUBROUTINE LogNormal_modes_Aerosol(FCCNR_CON,FCCNR_MAR,NKR_local,COL,XL,XCCN,RCCN,RO_SOLUTE,Scale_Fa,IType)
3739 integer,intent(in) :: NKR_local, Itype
3740 real(kind=r4size) ,intent(in) :: XL(:), COL, RO_SOLUTE, Scale_Fa
3741 real(kind=r8size) ,intent(out) :: FCCNR_CON(:), FCCNR_MAR(:)
3742 real(kind=r4size) ,intent(out) :: XCCN(:),RCCN(:)
3745 integer :: mode_num, KR
3746 integer,parameter :: modemax = 3
3747 real(kind=r8size) :: ccncon1, ccncon2, ccncon3, radius_mean1, radius_mean2, radius_mean3, &
3749 ccncon(modemax), sig(modemax), radius_mean(modemax)
3750 real(kind=r8size) :: CONCCCNIN, FCCNR_tmp(NKR_local), DEG01, X0DROP, &
3751 XOCCN, X0, R0, RCCN_MICRON, S_KR, S(NKR_local), X0CCN, ROCCN(NKR_local), &
3752 RO_SOLUTE_Ammon, RO_SOLUTE_NaCl,arg11,arg12,arg13,arg21,arg22,arg23, &
3753 arg31,arg32,arg33,dNbydlogR_norm1,dNbydlogR_norm2,dNbydlogR_norm3
3756 real(kind=r8size) ,PARAMETER :: RCCN_MAX = 0.4D-4 ! [cm]
3757 real(kind=r8size) ,PARAMETER :: RCCN_MIN = 0.003D-4 ! [cm]
3758 ! ... Minimal radii for dry aerosol for the 3 log normal distribution
3759 real(kind=r8size) ,PARAMETER :: RCCN_MIN_3LN = 0.00048D-4 ! [cm]
3760 real(kind=r8size) ,PARAMETER :: PI = 3.14159265D0
3763 ! ... Calculating the CCN radius grid
3764 !RO_SOLUTE_NaCl = 2.16D0 ! [g/cm3]
3765 !RO_SOLUTE_Ammon = 1.79 ! [g/cm3]
3768 X0CCN = X0DROP/(2.0**(NKR_local))
3769 DO KR = NKR_local,1,-1
3770 ROCCN(KR) = RO_SOLUTE
3771 X0 = X0CCN*2.0D0**(KR)
3772 R0 = (3.0D0*X0/4.0D0/3.141593D0/ROCCN(KR))**DEG01
3777 IF(IType == 1) THEN ! Maritime regime
3780 radius_mean1 = 0.00500D-04
3784 radius_mean2 = 0.03500D-04
3788 radius_mean3 = 0.31000D-04
3791 ELSE IF(IType == 2) THEN ! Continental regime
3794 radius_mean1 = 0.00800D-04
3798 radius_mean2 = 0.03400D-04
3802 radius_mean3 = 0.46000D-04
3810 arg11 = ccncon1/(sqrt(2.0D0*pi)*log(sig1))
3811 arg21 = ccncon2/(sqrt(2.0D0*pi)*log(sig2))
3812 arg31 = ccncon3/(sqrt(2.0D0*pi)*log(sig3))
3814 dNbydlogR_norm1 = 0.0
3815 dNbydlogR_norm2 = 0.0
3816 dNbydlogR_norm3 = 0.0
3817 do kr = NKR_local,1,-1
3818 if(RCCN(kr) > RCCN_MIN_3LN .and. RCCN(kr) < RCCN_MAX)then
3819 arg12 = (log(RCCN(kr)/radius_mean1))**2.0
3820 arg13 = 2.0D0*((log(sig1))**2.0);
3821 dNbydlogR_norm1 = arg11*exp(-arg12/arg13)*(log(2.0)/3.0)
3822 arg22 = (log(RCCN(kr)/radius_mean2))**2.0
3823 arg23 = 2.0D0*((log(sig2))**2.0)
3824 dNbydlogR_norm2 = dNbydlogR_norm1 + arg21*exp(-arg22/arg23)*(log(2.0)/3.0)
3825 arg32 = (log(RCCN(kr)/radius_mean3))**2.0
3826 arg33 = 2.0D0*((log(sig3))**2.0)
3827 dNbydlogR_norm3 = dNbydlogR_norm2 + arg31*exp(-arg32/arg33)*(log(2.0)/3.0);
3828 FCCNR_tmp(kr) = dNbydlogR_norm3/col
3832 CONCCCNIN = col*sum(FCCNR_tmp(:))
3833 print*,'CONCCCNIN',CONCCCNIN
3834 if(IType == 1) FCCNR_MAR = Scale_Fa*FCCNR_tmp
3835 if(IType == 2) FCCNR_CON = Scale_Fa*FCCNR_tmp
3838 END SUBROUTINE LogNormal_modes_Aerosol
3839 ! +---------------------------------------+
3840 end module module_mp_SBM_Nucleation
3841 ! +----------------------------------------------------------------------------+
3842 ! +----------------------------------------------------------------------------+
3843 MODULE module_mp_fast_sbm
3845 USE module_mp_SBM_polar_radar,ONLY:polar_hucm
3846 USE module_mp_SBM_BreakUp,ONLY:Spont_Rain_BreakUp,BreakUp_Snow,KR_SNOW_MIN,KR_SNOW_MAX
3847 USE module_mp_SBM_Nucleation,ONLY:JERNUCL01_KS, LogNormal_modes_Aerosol
3848 USE module_mp_SBM_Auxiliary,ONLY:JERRATE_KS,JERTIMESC_KS,JERSUPSAT_KS, &
3849 JERDFUN_KS,JERDFUN_NEW_KS,POLYSVP,Relaxation_Time
3850 USE scatt_tables,ONLY:faf1,fbf1,fab1,fbb1, &
3851 faf3,fbf3,fab3,fbb3, &
3852 faf4,fbf4,fab4,fbb4, &
3853 faf5,fbf5,fab5,fbb5, &
3855 temps_water,temps_fd,temps_crystals, &
3856 temps_snow,temps_graupel,temps_hail, &
3857 fws_fd,fws_crystals,fws_snow, &
3858 fws_graupel,fws_hail, &
3860 twolayer_hail,twolayer_graupel,twolayer_fd,twolayer_snow,rpquada,usequad
3864 PUBLIC FAST_SBM,FAST_HUCMINIT
3867 INTEGER, PARAMETER, PRIVATE:: R8SIZE = 8
3868 INTEGER, PARAMETER, PRIVATE:: R16SIZE = 16
3869 INTEGER, PARAMETER, PRIVATE:: R4SIZE = 4
3871 ! JacobS: Hard coding the bin-wise indices for the NMM core
3872 INTEGER, PRIVATE,PARAMETER :: p_ff1i01=2, p_ff1i33=34,p_ff5i01=35,p_ff5i33=67,p_ff6i01=68,&
3873 p_ff6i33=100,p_ff8i01=101,p_ff8i43=143
3875 ! JacobS: Hard coding for the polarimetric operator output array
3876 INTEGER, PRIVATE,PARAMETER :: r_p_ff1i01=2, r_p_ff1i06=07,r_p_ff2i01=08,r_p_ff2i06=13,r_p_ff3i01=14,&
3877 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,&
3878 r_p_ff7i01=38,r_p_ff7i06=43,r_p_ff8i01=44,r_p_ff8i06=49,r_p_ff9i01=50,r_p_ff9i06=55
3880 INTEGER,PARAMETER :: IBREAKUP = 1
3881 INTEGER,PARAMETER :: Snow_BreakUp_On = 1
3882 INTEGER,PARAMETER :: Spont_Rain_BreakUp_On = 1
3883 LOGICAL,PARAMETER :: CONSERV = .TRUE.
3884 INTEGER,PARAMETER :: JIWEN_FAN_MELT = 1
3885 LOGICAL,PARAMETER :: IPolar_HUCM = .TRUE.
3886 INTEGER,PARAMETER :: hail_opt = 1
3887 INTEGER,PARAMETER :: ILogNormal_modes_Aerosol = 1
3889 REAL,PARAMETER :: DX_BOUND = 1433
3890 REAL(kind=r8size), PARAMETER :: SCAL = 1.d0
3891 INTEGER,PARAMETER :: ICEPROCS = 1
3892 INTEGER,PARAMETER :: ICETURB = 0, LIQTURB = 0
3894 INTEGER,PARAMETER :: icempl=1,ICEMAX=3,NCD=33,NHYDR=5,NHYDRO=7 &
3895 ,K0_LL=8,KRMIN_LL=1,KRMAX_LL=19,L0_LL=6 &
3896 ,IEPS_400=1,IEPS_800=0,IEPS_1600=0 &
3897 ,K0L_GL=16,K0G_GL=16 &
3898 ,KRMINL_GL=1,KRMAXL_GL=24 &
3899 ,KRMING_GL=1,KRMAXG_GL=33 &
3900 ,KRDROP=15,KRBREAK=17,KRICE=18 & ! KRDROP=Bin 15 --> 50um
3901 !,NKR=43,JMAX=43,NRG=2,JBREAK=28,BR_MAX=43,KRMIN_BREAKUP=31,NKR_aerosol=43 ! 43 bins
3902 ,NKR=33,JMAX=33,NRG=2,JBREAK=18,BR_MAX=33,KRMIN_BREAKUP=31,NKR_aerosol=43 ! 33 bins
3904 REAL(kind=r4size) :: dt_coll
3905 REAL,PARAMETER :: C1_MEY=0.00033,C2_MEY=0.0,COL=0.23105, &
3906 p1=1000000.0,p2=750000.0,p3=500000.0, &
3908 ALCR_G = 100.0 ! ... [KS] forcing no transition from graupel to hail in this version
3909 INTEGER :: NCOND, NCOLL
3910 INTEGER,PARAMETER :: kr_icempl=9
3912 REAL(kind=r4size) :: &
3913 RADXX(NKR,NHYDR-1),MASSXX(NKR,NHYDR-1),DENXX(NKR,NHYDR-1) &
3914 ,MASSXXO(NKR,NHYDRO),DENXXO(NKR,NHYDRO),VRI(NKR) &
3915 ,XX(nkr),ROCCN(nkr),FCCNR_MIX(NKR),FCCNR(NKR)
3917 REAL(kind=r8size),DIMENSION (NKR) :: FF1R_D,XL_D,VR1_D &
3918 ,FF3R_D,XS_D,VR3_D,VTS_D,FLIQFR_SD,RO3BL_D &
3919 ,FF4R_D,XG_D,VR4_D,VTG_D,FLIQFR_GD,RO4BL_D &
3920 ,FF5R_D,XH_D,VR5_D,VTH_D,FLIQFR_HD,RO5BL_D &
3921 ,XS_MELT_D,XG_MELT_D,XH_MELT_D,VR_TEST,FRIMFR_SD,RF3R
3923 ! ... SBMRADAR VARIABLES
3924 REAL(kind=r8size),DIMENSION (nkr,icemax) :: XI_MELT_D &
3925 ,FF2R_D,XI_D,VR2_D,VTC_D,FLIQFR_ID,RO2BL_D
3926 REAL(kind=r8size) :: T_NEW_D,rhocgs_D,pcgs_D,DT_D,qv_old_D,qv_d
3928 REAL(kind=r4size),private :: C2,C3,C4
3929 REAL(kind=r8size),private :: &
3930 xl_mg(nkr),xs_mg(nkr),xg_mg(nkr),xh_mg(nkr) &
3931 ,xi1_mg(nkr),xi2_mg(nkr),xi3_mg(nkr)
3933 ! ----------------------------------------------------------------------------------+
3935 ! ... Holding Lookup tables and memory arrays for the FAST_SBM module
3936 REAL (KIND=R8SIZE), ALLOCATABLE, DIMENSION(:):: &
3937 bin_mass,tab_colum,tab_dendr,tab_snow,bin_log
3938 REAL (KIND=R4SIZE), ALLOCATABLE, DIMENSION(:) :: &
3939 RLEC,RSEC,RGEC,RHEC,XL,XS,XG,XH,VR1,VR3,VR4,VR5
3940 REAL (KIND=R4SIZE), ALLOCATABLE, DIMENSION(:,:):: &
3942 REAL (KIND=R4SIZE), ALLOCATABLE :: &
3943 COEFIN(:),SLIC(:,:),TLIC(:,:), &
3944 YWLL_1000MB(:,:),YWLL_750MB(:,:),YWLL_500MB(:,:)
3945 REAL (KIND=R4SIZE), ALLOCATABLE :: &
3946 YWLI_300MB(:,:,:),YWLI_500MB(:,:,:),YWLI_750MB(:,:,:), &
3947 YWLG_300MB(:,:),YWLG_500MB(:,:),YWLG_750MB(:,:),YWLG(:,:), &
3948 YWLH_300MB(:,:),YWLH_500MB(:,:),YWLH_750MB(:,:), &
3949 YWLS_300MB(:,:),YWLS_500MB(:,:),YWLS_750MB(:,:), &
3950 YWII_300MB(:,:,:,:),YWII_500MB(:,:,:,:),YWII_750MB(:,:,:,:), &
3951 YWII_300MB_tmp(:,:,:,:),YWII_500MB_tmp(:,:,:,:),YWII_750MB_tmp(:,:,:,:), &
3952 YWIS_300MB(:,:,:),YWIS_500MB(:,:,:),YWIS_750MB(:,:,:), &
3953 YWSG_300MB(:,:),YWSG_500MB(:,:),YWSG_750MB(:,:), &
3954 YWSS_300MB(:,:),YWSS_500MB(:,:),YWSS_750MB(:,:)
3956 REAL (KIND=R4SIZE), ALLOCATABLE :: &
3957 RO1BL(:), RO2BL(:,:), RO3BL(:), RO4BL(:), RO5BL(:), &
3960 INTEGER,ALLOCATABLE :: ima(:,:)
3961 REAL (KIND=R8SIZE), ALLOCATABLE :: chucm(:,:)
3963 REAL (KIND=R8SIZE), ALLOCATABLE :: BRKWEIGHT(:),ECOALMASSM(:,:), Prob(:),Gain_Var_New(:,:),NND(:,:)
3964 REAL (KIND=R4SIZE), ALLOCATABLE :: DROPRADII(:),PKIJ(:,:,:),QKJ(:,:)
3965 INTEGER :: ikr_spon_break
3967 REAL (KIND=R8SIZE), ALLOCATABLE :: cwll(:,:), &
3968 cwli_1(:,:),cwli_2(:,:),cwli_3(:,:), &
3969 cwil_1(:,:),cwil_2(:,:),cwil_3(:,:), &
3970 cwlg(:,:),cwlh(:,:),cwls(:,:), &
3971 cwgl(:,:),cwhl(:,:),cwsl(:,:), &
3972 cwii_1_1(:,:),cwii_1_2(:,:),cwii_1_3(:,:), &
3973 cwii_2_1(:,:),cwii_2_2(:,:),cwii_2_3(:,:), &
3974 cwii_3_1(:,:),cwii_3_2(:,:),cwii_3_3(:,:), &
3975 cwis_1(:,:),cwis_2(:,:),cwis_3(:,:), &
3976 cwsi_1(:,:),cwsi_2(:,:),cwsi_3(:,:), &
3977 cwig_1(:,:),cwig_2(:,:),cwig_3(:,:), &
3978 cwih_1(:,:),cwih_2(:,:),cwih_3(:,:), &
3980 REAL(kind=r8size),ALLOCATABLE :: FCCNR_MAR(:),FCCNR_CON(:)
3981 REAL(kind=r4size),ALLOCATABLE :: Scale_CCN_Factor,XCCN(:),RCCN(:),FCCN(:)
3984 ! --------------------------------------------------------------------------------+
3988 ! ### (KS) - CCN related
3989 ! -----------------------------------------------------------------------
3990 !REAL (KIND=R4SIZE), parameter :: mwaero = 22.9 + 35.5 ! sea salt
3991 real(kind=r4size),parameter :: mwaero = 115.0
3992 !integer,parameter :: ions = 2 ! sea salt
3993 integer,parameter :: ions = 3 ! ammonium-sulfate
3994 !real(KIND=R4SIZE),parameter :: RO_SOLUTE = 2.16 ! sea salt
3995 real(kind=r4size),parameter :: RO_SOLUTE = 1.79 ! ammonium-sulfate
3996 ! ----------------------------------------------------------------------
3997 REAL (KIND=R4SIZE) :: FR_LIM(NKR), FRH_LIM(NKR)
4000 !-----------------------------------------------------------------------
4001 SUBROUTINE FAST_SBM (w,u,v,th_old, &
4002 & chem_new,n_chem, &
4003 & itimestep,DT,DX,DY, &
4004 & dz8w,rho_phy,p_phy,pi_phy,th_phy, &
4005 & xland,domain_id,ivgtyp,xlat,xlong, &
4006 & QV,QC,QR,QI,QS,QG,QV_OLD, &
4007 & QNC,QNR,QNI,QNS,QNG,QNA, &
4008 & ids,ide, jds,jde, kds,kde, &
4009 & ims,ime, jms,jme, kms,kme, &
4010 & its,ite, jts,jte, kts,kte, &
4012 & sbmradar,num_sbmradar, &
4013 & sbm_diagnostics, &
4014 & RAINNC,RAINNCV,SNOWNC,SNOWNCV,GRAUPELNC,GRAUPELNCV,SR)
4015 !-----------------------------------------------------------------------
4017 !-----------------------------------------------------------------------
4018 INTEGER :: KR,IKL,ICE
4020 INTEGER,INTENT(IN) :: IDS,IDE,JDS,JDE,KDS,KDE &
4021 & ,IMS,IME,JMS,JME,KMS,KME &
4022 & ,ITS,ITE,JTS,JTE,KTS,KTE &
4023 & ,ITIMESTEP,N_CHEM,NUM_SBMRADAR,domain_id &
4026 REAL, INTENT(IN) :: DT,DX,DY
4027 REAL, DIMENSION( ims:ime , kms:kme , jms:jme ), &
4033 REAL ,DIMENSION(ims:ime,kms:kme,jms:jme,n_chem),INTENT(INOUT) :: chem_new
4034 REAL ,DIMENSION(ims:ime,kms:kme,jms:jme,num_sbmradar),INTENT(INOUT) :: sbmradar
4035 REAL, DIMENSION( ims:ime , kms:kme , jms:jme ), &
4052 REAL , DIMENSION( ims:ime , jms:jme ) , INTENT(IN) :: XLAND
4053 LOGICAL, OPTIONAL, INTENT(IN) :: diagflag
4055 INTEGER, DIMENSION( ims:ime , jms:jme ), INTENT(IN):: IVGTYP
4056 REAL, DIMENSION( ims:ime, jms:jme ), INTENT(IN ) :: XLAT, XLONG
4057 REAL, INTENT(IN), DIMENSION(ims:ime, kms:kme, jms:jme):: &
4058 & dz8w,p_phy,pi_phy,rho_phy
4059 REAL, INTENT(INOUT), DIMENSION(ims:ime, kms:kme, jms:jme):: &
4061 REAL, INTENT(INOUT), DIMENSION(ims:ime,jms:jme), OPTIONAL :: &
4062 & RAINNC,RAINNCV,SNOWNC,SNOWNCV,GRAUPELNC,GRAUPELNCV,SR
4064 !-----------------------------------------------------------------------
4066 !-----------------------------------------------------------------------
4068 REAL (KIND=R4SIZE), DIMENSION(its-1:ite+1, kts:kte, jts-1:jte+1):: &
4069 t_new,t_old,zcgs,rhocgs,pcgs
4071 INTEGER :: I,J,K,KFLIP
4074 REAL (KIND=R4SIZE),PARAMETER :: Z0IN=2.0E5,ZMIN=2.0E5
4076 REAL (KIND=R4SIZE) :: EPSF2D, &
4077 & TAUR1,TAUR2,EPS_R1,EPS_R2,ANC1IN, &
4078 & PEPL,PEPI,PERL,PERI,ANC1,ANC2,PARSP, &
4079 & AFREEZMY,BFREEZMY,BFREEZMAX, &
4081 & EPSF1,EPSF3,EPSF4, &
4082 & SUP2_OLD, DSUPICEXZ,TFREEZ_OLD,DTFREEZXZ, &
4083 & AA1_MY,BB1_MY,AA2_MY,BB2_MY, &
4084 & DTIME,DTCOND,DTNEW,DTCOLL, &
4085 & A1_MYN, BB1_MYN, A2_MYN, BB2_MYN
4086 DATA A1_MYN, BB1_MYN, A2_MYN, BB2_MYN &
4087 & /2.53,5.42,3.41E1,6.13/
4088 DATA AA1_MY,BB1_MY,AA2_MY,BB2_MY/2.53E12,5.42E3,3.41E13,6.13E3/
4089 !QSUM,ISUM,QSUM1,QSUM2,CCNSUM1,CCNSUM2
4090 DATA KRFREEZ,BFREEZMAX,ANC1,ANC2,PARSP,PEPL,PEPI,PERL,PERI, &
4091 & TAUR1,TAUR2,EPS_R1,EPS_R2,TTCOAL,AFREEZMY,&
4092 & BFREEZMY,EPSF1,EPSF3,EPSF4,TCRIT/21,&
4094 & 1.0000E02,1.0000E02,0.9000E02, &
4095 & 0.6000E00,0.6000E00,1.0000E-03,1.0000E-03, &
4096 & 0.5000E00,0.8000E00,0.1500E09,0.1500E09, &
4097 & 2.3315E02,0.3333E-04,0.6600E00, &
4098 & 0.1000E-02,0.1000E-05,0.1000E-05, &
4101 REAL (KIND=R4SIZE),DIMENSION (nkr) :: FF1IN,FF3IN,FF4IN,FF5IN,&
4102 & FF1R,FF3R,FF4R,FF5R,FLIQFR_S,FRIMFR_S,FLIQFR_G,FLIQFR_H, &
4103 & FF1R_NEW,FF3R_NEW,FF4R_NEW,FF5R_NEW
4104 REAL (KIND=R4SIZE),DIMENSION (nkr) :: FL3R,FL4R,FL5R,FL3R_NEW,FL4R_NEW,FL5R_NEW
4106 REAL (KIND=R4SIZE),DIMENSION (nkr,icemax) :: FF2IN,FF2R,FLIQFR_I
4108 REAL (KIND=R4SIZE) :: XI_MELT(NKR,ICEMAX),XS_MELT(NKR),XG_MELT(NKR),XH_MELT(NKR)
4109 !!!! NOTE: ZCGS AND OTHER VARIABLES ARE ALSO DIMENSIONED IN FALFLUXHUCM
4110 REAL (KIND=R8SIZE) :: DEL1NR,DEL2NR,DEL12R,DEL12RD,ES1N,ES2N,EW1N,EW1PN
4111 REAL (KIND=R8SIZE) :: DELSUP1,DELSUP2,DELDIV1,DELDIV2
4112 REAL (KIND=R8SIZE) :: TT,QQ,TTA,QQA,PP,DPSA,DELTATEMP,DELTAQ
4113 REAL (KIND=R8SIZE) :: DIV1,DIV2,DIV3,DIV4,DEL1IN,DEL2IN,DEL1AD,DEL2AD,DEL_T,DEL_Q
4114 REAL (KIND=R4SIZE) :: DEL_BB,DEL_BBN,DEL_BBR, TTA_r
4115 REAL (KIND=R4SIZE) :: FACTZ,CONCCCN_XZ,CONCDROP
4116 REAL (KIND=R4SIZE) :: SUPICE(KTE),AR1,AR2, &
4117 & DERIVT_X,DERIVT_Y,DERIVT_Z,DERIVS_X,DERIVS_Y,DERIVS_Z, &
4118 & ES2NPLSX,ES2NPLSY,EW1NPLSX,EW1NPLSY,UX,VX, &
4119 & DEL2INPLSX,DEL2INPLSY,DZZ(KTE)
4120 INTEGER KRR,I_START,I_END,J_START,J_END
4121 REAL (KIND=R4SIZE) :: DTFREEZ_XYZ(ITE,KTE,JTE),DSUPICE_XYZ(ITE,KTE,JTE)
4123 REAL (KIND=R4SIZE) :: DXHUCM,DYHUCM
4124 REAL (KIND=R4SIZE) :: FMAX1,FMAX2(ICEMAX),FMAX3,FMAX4,FMAX5
4125 INTEGER ISYM1,ISYM2(ICEMAX),ISYM3,ISYM4,ISYM5
4127 REAL (KIND=R4SIZE) :: DELTAW
4128 REAL (KIND=R4SIZE) :: zcgs_z(kts:kte),pcgs_z(kts:kte),rhocgs_z(kts:kte),ffx_z(kts:kte,nkr)
4129 REAL (KIND=R4SIZE) :: z_full
4130 REAL (KIND=R4SIZE) :: VRX(kts:kte,NKR)
4132 REAL (KIND=R4SIZE) :: VR1_Z(NKR,KTS:KTE), FACTOR_P, VR1_Z3D(NKR,ITS:ITE,KTS:KTE,JTS:JTE)
4133 REAL (KIND=R4SIZE) :: VR2_ZC(NKR,KTS:KTE), VR2_Z(NKR,ICEMAX)
4134 REAL (KIND=R4SIZE) :: VR2_ZP(NKR,KTS:KTE)
4135 REAL (KIND=R4SIZE) :: VR2_ZD(NKR,KTS:KTE)
4136 REAL (KIND=R4SIZE) :: VR3_Z(NKR,KTS:KTE), VR3_Z3D(NKR,ITS:ITE,KTS:KTE,JTS:JTE)
4137 REAL (KIND=R4SIZE) :: VR4_Z(NKR,KTS:KTE), VR4_Z3D(NKR,ITS:ITE,KTS:KTE,JTS:JTE)
4138 REAL (KIND=R4SIZE) :: VR5_Z(NKR,KTS:KTE), VR5_Z3D(NKR,ITS:ITE,KTS:KTE,JTS:JTE)
4139 REAL (KIND=R4SIZE) :: BulkDen_Snow(NKR,ITS:ITE,KTS:KTE,JTS:JTE) ! Local array for snow density
4141 REAL (KIND=R4SIZE), PARAMETER :: RON=8.E6, GON=5.E7,PI=3.14159265359
4142 REAL (KIND=R4SIZE) :: EFF_N,EFF_D
4143 REAL (KIND=R4SIZE) :: EFF_NI(its:ite,kts:kte,jts:jte),eff_di(its:ite,kts:kte,jts:jte)
4144 REAL (KIND=R4SIZE) :: EFF_NQIC,eff_DQIC
4145 REAL (KIND=R4SIZE) :: EFF_NQIP,eff_DQIP
4146 REAL (KIND=R4SIZE) :: EFF_NQID,eff_DQID
4147 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
4148 REAL (KIND=R4SIZE), DIMENSION(kts:kte):: &
4149 qv1d, qr1d, nr1d, qs1d, ns1d, qg1d, ng1d, t1d, p1d
4150 REAL (KIND=R4SIZE), DIMENSION(kts:kte):: dBZ
4152 REAL (KIND=R4SIZE) :: nzero,son,nzero_less
4153 parameter (son=2.E7)
4154 REAL (KIND=R4SIZE) :: raddumb(nkr),massdumb(nkr)
4155 REAL (KIND=R4SIZE) :: hydrosum
4157 integer imax,kmax,jmax
4158 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
4160 parameter (print_int=300)
4162 integer t_print,i_print,j_print,k_print
4163 REAL (KIND=R8SIZE), DIMENSION(kts:kte):: zmks_1d
4164 REAL (KIND=R8SIZE) :: dx_dbl, dy_dbl
4165 INTEGER,DIMENSION (nkr) :: melt_snow,melt_graupel,melt_hail,melt_ice
4166 !DOUBLE PRECISION,DIMENSION (nkr) :: dmelt_snow,dmelt_graupel,dmelt_hail,dmelt_ice
4168 REAL (KIND=R4SIZE) :: NSNOW_ADD
4171 INTEGER,PARAMETER :: n_radar = 10
4172 integer :: ijk, Mod_Flag
4173 REAL (KIND=R8SIZE),PARAMETER :: wavelength = 11.0D0 ! ### (KS) - Rhyzkov uses this wavelength (NEXRAD)
4175 REAL (KIND=R4SIZE) :: DIST_SING
4176 REAL (KIND=R8SIZE) :: BKDEN_Snow(NKR)
4177 REAL (KIND=R8SIZE) :: DISTANCE,FL1_FD(NKR),BULK(NKR), BulkDens_Snow(NKR)
4178 REAL (KIND=R8SIZE) :: FF1_FD(NKR),FFL_FD(NKR),OUT1(n_radar),OUT2(n_radar),OUT3(n_radar),OUT4(n_radar),OUT5(n_radar), &
4179 OUT6(n_radar),OUT7(n_radar),OUT8(n_radar),OUT9(n_radar), FL1R_FD(NKR)
4180 REAL (KIND=R8SIZE) :: rate_shed_per_grau_grampersec(NKR), rate_shed_per_hail_grampersec(NKR), rhoair_max
4182 integer :: count_H, count_G, count_S_l, count_S_r
4184 REAL (KIND=R8SIZE) :: RMin_G
4185 integer :: KR_GRAUP_MAX_BLAHAK, KR_G_TO_H
4187 ! ... Cloud Base .........................................................
4188 REAL (KIND=R8SIZE) :: SUP_WATER, ES1N_KS, ES1N_dummy, ES2N_dummy
4190 integer :: KZ_Cloud_Base(its:ite,jts:jte), IS_THIS_CLOUDBASE,KR_Small_Ice
4191 ! ........................................................................
4192 REAL (KIND=R4SIZE) :: qna0(its:ite,kts:kte,jts:jte), fr_hom, w_stagm, CollEff_out, FACT
4193 REAL (KIND=R4SIZE) :: FACTZ_new(KMS:KME,NKR), TT_r
4194 ! ### (KS) ............................................................................................
4195 INTEGER :: NZ,NZZ,II,JJ
4199 if (itimestep.eq.1)then
4200 if (iceprocs.eq.1) call wrf_message(" FAST SBM: ICE PROCESES ACTIVE ")
4201 if (iceprocs.eq.0) call wrf_message(" FAST SBM: LIQUID PROCESES ONLY")
4206 DTCOND = DT/REAL(NCOND)
4207 DTCOLL = DT/REAL(NCOLL)
4210 DEL_BB=BB2_MY-BB1_MY
4211 DEL_BBN=BB2_MYN-BB1_MYN
4212 DEL_BBR=BB1_MYN/DEL_BBN
4219 rhocgs(I,K,J)=rho_phy(I,K,J)*0.001
4222 DO KR=p_ff1i01,p_ff1i33
4224 chem_new(I,K,J,KR)=chem_new(I,K,J,KR)*RHOCGS(I,K,J)/COL/XL(KRR)/XL(KRR)/3.0
4228 DO KR=p_ff5i01,p_ff5i33
4230 chem_new(I,K,J,KR)=chem_new(I,K,J,KR)*RHOCGS(I,K,J)/COL/XS(KRR)/XS(KRR)/3.0
4234 DO KR=p_ff8i01,p_ff8i43
4236 chem_new(I,K,J,KR) = chem_new(I,K,J,KR)*RHOCGS(I,K,J)/1000.0
4238 ! ... Hail or Graupel [same registry adresses]
4239 if(hail_opt == 1) then
4241 DO KR=p_ff6i01,p_ff6i33
4243 chem_new(I,K,J,KR)=chem_new(I,K,J,KR)*RHOCGS(I,K,J)/COL/XH(KRR)/XH(KRR)/3.0
4248 DO KR=p_ff6i01,p_ff6i33
4250 chem_new(I,K,J,KR)=chem_new(I,K,J,KR)*RHOCGS(I,K,J)/COL/XG(KRR)/XG(KRR)/3.0
4262 I_START=MAX(1,ITS-1)
4263 J_START=MAX(1,JTS-1)
4264 I_END=MIN(IDE-1,ITE+1)
4265 J_END=MIN(JDE-1,JTE+1)
4267 DO j = j_start,j_end
4268 DO i = i_start,i_end
4271 pcgs(I,K,J)=P_PHY(I,K,J)*10.
4272 rhocgs(I,K,J)=rho_phy(I,K,J)*0.001
4273 zcgs(I,K,J)=z_full+0.5*dz8w(I,K,J)*100
4274 !height(i,k,j) = 1.0e-2*zcgs(i,k,j) ! in [m]
4275 z_full=z_full+dz8w(i,k,j)*100.
4280 ! +---------------------------------------+
4281 ! ... Initial Aerosol distribution
4282 ! +---------------------------------------+
4283 if (itimestep == 1)then
4288 rhoair_max = rhocgs(i,1,j) ! [g/cm3]
4289 if(ILogNormal_modes_Aerosol == 1)then
4290 IF (zcgs(I,K,J) .LE. ZMIN)THEN
4293 FACTZ=EXP(-(zcgs(I,K,J)-ZMIN)/Z0IN)
4297 DO KR = p_ff8i01,p_ff8i43
4299 if (xland(i,j) == 1)then
4300 ! chem_new(I,K,J,KR)=FCCNR_CON(KRR)*FACTZ
4301 chem_new(I,K,J,KR) = (FCCNR_CON(KRR)/rhoair_max)*rhocgs(i,k,j) ! ... distributed vertically as [#/g]
4303 ! chem_new(I,K,J,KR)=FCCNR_MAR(KRR)*FACTZ
4304 chem_new(I,K,J,KR) = (FCCNR_MAR(KRR)/rhoair_max)*rhocgs(i,k,j) ! ... distributed vertically as [#/g]
4313 ! +--------------------------------------------+
4314 ! ... Aerosols boundary conditions
4315 ! (for 3D application running with MPI)
4316 ! +--------------------------------------------+
4317 #if (defined(DM_PARALLEL))
4318 if (itimestep > 1 .and. domain_id == 1)then
4322 rhoair_max = rhocgs(i,1,j) ! [g/cm3]
4323 if (i <= 5 .or. i >= IDE-5 .OR. &
4324 & j <= 5 .or. j >= JDE-5)THEN
4325 if(ILogNormal_modes_Aerosol == 1)then
4326 IF (zcgs(I,K,J).LE.ZMIN) THEN
4329 FACTZ=EXP(-(zcgs(I,K,J)-ZMIN)/Z0IN)
4333 DO kr = p_ff8i01,p_ff8i43
4335 if (xland(i,j) == 1)then
4336 ! chem_new(I,K,J,KR)=FCCNR_CON(KRR)*FACTZ
4337 chem_new(I,K,J,KR) = (FCCNR_CON(KRR)/rhoair_max)*rhocgs(i,k,j)
4339 ! chem_new(I,K,J,KR)=FCCNR_MAR(KRR)*FACTZ
4340 chem_new(I,K,J,KR) = (FCCNR_MAR(KRR)/rhoair_max)*rhocgs(i,k,j)
4351 if (itimestep == 1)then
4352 DO j = j_start,j_end
4354 DO i = i_start,i_end
4355 th_old(i,k,j)=th_phy(i,k,j)
4356 qv_old(i,k,j)=qv(i,k,j)
4362 DO j = j_start,j_end
4364 DO i = i_start,i_end
4365 t_new(i,k,j) = th_phy(i,k,j)*pi_phy(i,k,j)
4366 !tempc(i,k,j)= t_new(i,k,j)-273.16
4367 t_old(i,k,j) = th_old(i,k,j)*pi_phy(i,k,j)
4372 IF(ICEPROCS == 1)THEN
4379 ES1N = AA1_MY*EXP(-BB1_MY/T_NEW(I,K,J))
4380 EW1N = QV(I,K,J)*pcgs(I,K,J)/(0.622+0.378*QV(I,K,J))
4381 SUP_WATER = EW1N/ES1N - 1.0
4383 w_stag_my = 50.*(w(i,k,j)+w(i,k+1,j))
4385 w_stag_my = 100*w(i,k,j)
4387 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
4388 KZ_Cloud_Base(I,J) = K ! K-level index of cloud base
4393 DZZ(K)=(zcgs(I,K,J)-zcgs(I,K-1,J))
4395 DZZ(K)=(zcgs(I,K+1,J)-zcgs(I,K,J))
4397 DZZ(K)=(zcgs(I,K+1,J)-zcgs(I,K-1,J))
4399 ES2N=AA2_MY*EXP(-BB2_MY/T_OLD(I,K,J))
4400 EW1N=QV_OLD(I,K,J)*pcgs(I,K,J)/(0.622+0.378*QV_OLD(I,K,J))
4401 SUPICE(K)=EW1N/ES2N-1.
4402 IF(SUPICE(K).GT.0.5) SUPICE(K)=.5
4405 IF(T_OLD(I,K,J).GE.238.15.AND.T_OLD(I,K,J).LT.274.15) THEN
4407 w_stag=50.*(w(i,k,j)+w(i,k+1,j))
4411 IF (I.LT.IDE-1.AND.J.LT.JDE-1)THEN
4412 UX=25.*(U(I,K,J)+U(I+1,K,J)+U(I,K,J+1)+U(I+1,K,J+1))
4413 VX=25.*(V(I,K,J)+V(I+1,K,J)+V(I,K,J+1)+V(I+1,K,J+1))
4418 IF(K.EQ.1) DERIVT_Z=(T_OLD(I,K+1,J)-T_OLD(I,K,J))/DZZ(K)
4419 IF(K.EQ.KTE) DERIVT_Z=(T_OLD(I,K,J)-T_OLD(I,K-1,J))/DZZ(K)
4420 IF(K.GT.1.AND.K.LT.KTE) DERIVT_Z= &
4421 (T_OLD(I,K+1,J)-T_OLD(I,K-1,J))/DZZ(K)
4423 DERIVT_X=(T_OLD(I+1,K,J)-T_OLD(I,K,J))/(DXHUCM)
4424 ELSE IF (I.EQ.IDE-1)THEN
4425 DERIVT_X=(T_OLD(I,K,J)-T_OLD(I-1,K,J))/(DXHUCM)
4427 DERIVT_X=(T_OLD(I+1,K,J)-T_OLD(I-1,K,J))/(2.*DXHUCM)
4430 DERIVT_Y=(T_OLD(I,K,J+1)-T_OLD(I,K,J))/(DYHUCM)
4431 ELSE IF (J.EQ.JDE-1)THEN
4432 DERIVT_Y=(T_OLD(I,K,J)-T_OLD(I,K,J-1))/(DYHUCM)
4434 DERIVT_Y=(T_OLD(I,K,J+1)-T_OLD(I,K,J-1))/(2.*DYHUCM)
4436 DTFREEZ_XYZ(I,K,J) = DT*(VX*DERIVT_Y+ &
4437 UX*DERIVT_X+w_stag*DERIVT_Z)
4438 ELSE ! IF(T_OLD(I,K,J).GE.238.15.AND.T_OLD(I,K,J).LT.274.15)
4439 DTFREEZ_XYZ(I,K,J)=0.
4441 IF(SUPICE(K).GE.0.02.AND.T_OLD(I,K,J).LT.268.15) THEN
4443 ES2NPLSX=AA2_MY*EXP(-BB2_MY/T_OLD(I+1,K,J))
4444 EW1NPLSX=QV_OLD(I+1,K,J)*pcgs(I+1,K,J)/ &
4445 (0.622+0.378*QV_OLD(I+1,K,J))
4447 ES2NPLSX = AA2_MY*EXP(-BB2_MY/T_OLD(I,K,J))
4448 EW1NPLSX = QV_OLD(I,K,J)*pcgs(I,K,J)/ &
4449 (0.622+0.378*QV_OLD(I,K,J))
4451 IF (ES2NPLSX.EQ.0)THEN
4454 DEL2INPLSX=EW1NPLSX/ES2NPLSX-1.
4456 IF(DEL2INPLSX.GT.0.5) DEL2INPLSX=.5
4458 ES2N=AA2_MY*EXP(-BB2_MY/T_OLD(I-1,K,J))
4459 EW1N=QV_OLD(I-1,K,J)*pcgs(I-1,K,J)/(0.622+0.378*QV_OLD(I-1,K,J))
4461 ES2N=AA2_MY*EXP(-BB2_MY/T_OLD(I,K,J))
4462 EW1N=QV_OLD(I,K,J)*pcgs(I,K,J)/(0.622+0.378*QV_OLD(I,K,J))
4465 IF(DEL2IN.GT.0.5) DEL2IN=.5
4466 IF (I.GT.1.AND.I.LT.IDE-1)THEN
4467 DERIVS_X=(DEL2INPLSX-DEL2IN)/(2.*DXHUCM)
4469 DERIVS_X=(DEL2INPLSX-DEL2IN)/(DXHUCM)
4472 ES2NPLSY=AA2_MY*EXP(-BB2_MY/T_OLD(I,K,J+1))
4473 EW1NPLSY=QV_OLD(I,K,J+1)*pcgs(I,K,J+1)/(0.622+0.378*QV_OLD(I,K,J+1))
4475 ES2NPLSY=AA2_MY*EXP(-BB2_MY/T_OLD(I,K,J))
4476 EW1NPLSY=QV_OLD(I,K,J)*pcgs(I,K,J)/(0.622+0.378*QV_OLD(I,K,J))
4478 DEL2INPLSY=EW1NPLSY/ES2NPLSY-1.
4479 IF(DEL2INPLSY.GT.0.5) DEL2INPLSY=.5
4481 ES2N=AA2_MY*EXP(-BB2_MY/T_OLD(I,K,J-1))
4482 EW1N=QV_OLD(I,K,J-1)*pcgs(I,K,J-1)/(0.622+0.378*QV_OLD(I,K,J-1))
4484 ES2N=AA2_MY*EXP(-BB2_MY/T_OLD(I,K,J))
4485 EW1N=QV_OLD(I,K,J)*pcgs(I,K,J)/(0.622+0.378*QV_OLD(I,K,J))
4488 IF(DEL2IN.GT.0.5) DEL2IN=.5
4489 IF (J.GT.1.AND.J.LT.JDE-1)THEN
4490 DERIVS_Y=(DEL2INPLSY-DEL2IN)/(2.*DYHUCM)
4492 DERIVS_Y=(DEL2INPLSY-DEL2IN)/(DYHUCM)
4494 IF (K.EQ.1)DERIVS_Z=(SUPICE(K+1)-SUPICE(K))/DZZ(K)
4495 IF (K.EQ.KTE)DERIVS_Z=(SUPICE(K)-SUPICE(K-1))/DZZ(K)
4496 IF(K.GT.1.and.K.LT.KTE) DERIVS_Z=(SUPICE(K+1)-SUPICE(K-1))/DZZ(K)
4497 IF (I.LT.IDE-1.AND.J.LT.JDE-1)THEN
4498 UX=25.*(U(I,K,J)+U(I+1,K,J)+U(I,K,J+1)+U(I+1,K,J+1))
4499 VX=25.*(V(I,K,J)+V(I+1,K,J)+V(I,K,J+1)+V(I+1,K,J+1))
4504 DSUPICE_XYZ(I,K,J)=(UX*DERIVS_X+VX*DERIVS_Y+ &
4505 w_stag*DERIVS_Z)*DTCOND
4507 DSUPICE_XYZ(I,K,J)=0.0
4518 ! ... correcting Look-up-table Terminal velocities
4519 FACTOR_P = DSQRT(1.0D6/PCGS(I,K,J))
4520 VR2_ZC(1:nkr,K) = VR2(1:nkr,1)*FACTOR_P
4521 VR2_ZP(1:nkr,K) = VR2(1:nkr,2)*FACTOR_P
4522 VR2_ZD(1:nkr,K) = VR2(1:nkr,3)*FACTOR_P
4523 VR1_Z(1:nkr,K) = VR1(1:nkr)*FACTOR_P
4524 VR3_Z(1:nkr,K) = VR3(1:nkr)*FACTOR_P
4525 VR4_Z(1:nkr,K) = VR4(1:nkr)*FACTOR_P
4526 VR5_Z(1:nkr,k) = VR5(1:nkr)*FACTOR_P
4527 VR1_Z3D(1:nkr,I,K,J) = VR1(1:nkr)*FACTOR_P
4528 VR3_Z3D(1:nkr,I,K,J) = VR3(1:nkr)*FACTOR_P
4529 VR4_Z3D(1:nkr,I,K,J) = VR4(1:nkr)*FACTOR_P
4530 VR5_Z3D(1:nkr,I,K,J) = VR5(1:nkr)*FACTOR_P
4534 DO kr = p_ff1i01,p_ff1i33
4536 FF1R(KRR) = chem_new(I,K,J,KR)
4537 IF (FF1R(KRR) < 0.0)FF1R(KRR) = 0.0
4541 DO kr=p_ff8i01,p_ff8i43
4543 FCCN(KRR) = chem_new(I,K,J,KR)
4544 if (fccn(krr) < 0.0)fccn(krr) = 0.0
4547 ! no explicit Ice Crystals in FSBM
4554 DO kr=p_ff5i01,p_ff5i33
4556 FF3R(KRR)=chem_new(I,K,J,KR)
4557 if (ff3r(krr) < 0.0)ff3r(krr) = 0.0
4560 ! ... Hail or Graupel
4561 if(hail_opt == 1)then
4563 DO kr=p_ff6i01,p_ff6i33
4565 FF5R(KRR) = chem_new(I,K,J,KR)
4566 if (ff5r(krr) < 0.0)ff5r(krr) = 0.0
4571 DO kr=p_ff6i01,p_ff6i33
4573 FF4R(KRR) = chem_new(I,K,J,KR)
4574 if (ff4r(krr) < 0.0)ff4r(krr) = 0.0
4579 ! +---------------------------------------------+
4580 ! Neucliation, Condensation, Collisions
4581 ! +---------------------------------------------+
4582 IF (T_OLD(I,K,J).GT.193.15)THEN
4585 IF(QQ.LE.0.0) QQ = 1.D-10
4590 IF (QQA.LE.0) call wrf_message("WARNING: FAST SBM, QQA < 0")
4591 IF (QQA.LE.0) print*,'I,J,K,Told,Tnew,QQA = ',I,J,K,TT,TTA,QQA
4592 IF (QQA.LE.0) QQA = 1.0D-10
4594 ES1N = AA1_MY*DEXP(-BB1_MY/TT)
4595 ES2N = AA2_MY*DEXP(-BB2_MY/TT)
4596 EW1N=QQ*PP/(0.622+0.378*QQ)
4601 ES1N=AA1_MY*DEXP(-BB1_MY/TTA)
4602 ES2N=AA2_MY*DEXP(-BB2_MY/TTA)
4603 EW1N=QQA*PP/(0.622+0.378*QQA)
4610 IF(del1ad > 0.0 .or. del2ad > 0.0 .or. (sum(FF1R)+sum(FF3R)+sum(FF4R)+sum(FF5R)) > 1.0e-20)THEN
4611 DEL_T = (TTA - TT) / NCOND
4612 DEL_Q = (QQA - QQ) / 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
4627 ES1N = AA1_MY*DEXP(-BB1_MY/TT)
4628 ES2N = AA2_MY*DEXP(-BB2_MY/TT)
4629 EW1N = QQ*PP/(0.622+0.378*QQ)
4631 DEL1IN = EW1N/ES1N-1.0
4633 DEL2IN = EW1N/ES2N-1.0
4635 IF (DIV1.GT.DIV2.AND.TT.LE.265)THEN
4639 IF(DEL1IN > 0.0 .OR. DEL2IN > 0.0)THEN
4640 ! +------------------------------------------+
4641 ! Droplet nucleation :
4642 ! +------------------------------------------+
4646 FF2IN(KR,ICE)=FF2R(KR,ICE)
4649 Is_This_CloudBase = 0
4650 IF(KZ_Cloud_Base(I,J) == K .and. col*sum(FF1IN*XL) < 5.0) Is_This_CloudBase = 1
4652 w_stag_my = 50.*(w(i,k,j)+w(i,k+1,j))
4654 w_stag_my = 100*w(i,k,j)
4656 CALL JERNUCL01_KS(FF1IN,FF2IN,FCCN &
4658 ,rhocgs(I,K,J),pcgs(I,K,J) &
4661 ,SUP2_OLD,DSUPICE_XYZ(I,K,J) &
4662 ,RCCN,DROPRADII,NKR,NKR_aerosol,ICEMAX,ICEPROCS &
4663 ,W_Stag_My,Is_This_CloudBase,RO_SOLUTE,IONS,MWAERO &
4670 FF3R(KR) = FF3R(KR) + FF2IN(KR,ICE)
4684 FMAX1=AMAX1(FF1R(KR),FMAX1)
4686 FMAX3=AMAX1(FF3R(KR),FMAX3)
4688 FMAX4=AMAX1(FF4R(KR),FMAX4)
4690 FMAX5=AMAX1(FF5R(KR),FMAX5)
4692 FF2IN(KR,ICE)=FF2R(KR,ICE)
4693 FMAX2(ICE)=AMAX1(FF2R(KR,ICE),FMAX2(ICE)) ! ### (KS) FMAX2(3)
4701 IF(FMAX1 > 0)ISYM1 = 1
4702 IF (ICEPROCS == 1)THEN
4703 IF(FMAX2(1) > 1.E-10)ISYM2(1) = 1
4704 IF(FMAX2(2) > 1.E-10)ISYM2(2) = 1
4705 IF(FMAX2(3) > 1.E-10)ISYM2(3) = 1
4706 IF(FMAX3 > 1.E-10)ISYM3 = 1
4707 IF(FMAX4 > 1.E-10)ISYM4 = 1
4708 IF(FMAX5 > 1.E-10)ISYM5 = 1
4711 IF(ISYM1==1 .AND. ((TT-273.15)>-0.187 .OR.(sum(ISYM2)==0 .AND. &
4712 ISYM3==0 .AND. ISYM4==0 .AND. ISYM5==0)))THEN
4714 ! ... only warm phase
4715 CALL ONECOND1(TT,QQ,PP,rhocgs(I,K,J) &
4716 ,VR1_Z(:,K),pcgs(I,K,J) &
4717 ,DEL1IN,DEL2IN,DIV1,DIV2 &
4718 ,FF1R,FF1IN,XL,RLEC,RO1BL &
4719 ,AA1_MY,BB1_MY,AA2_MY,BB2_MY &
4721 ,COL,DTCOND,ICEMAX,NKR,ISYM1 &
4722 ,ISYM2,ISYM3,ISYM4,ISYM5,I,J,K,W(i,k,j),DX,Itimestep)
4724 ELSE IF(ISYM1==0 .AND. (TT-273.15)<-0.187 .AND. &
4725 (sum(ISYM2)>1 .OR. ISYM3==1 .OR. ISYM4==1 .OR. ISYM5==1))THEN
4726 !IF (TT.GT.213.15)THEN
4727 VR2_Z(:,1) = VR2_ZC(:,K)
4728 VR2_Z(:,2) = VR2_ZP(:,K)
4729 VR2_Z(:,3) = VR2_ZD(:,K)
4730 CALL ONECOND2(TT,QQ,PP,rhocgs(I,K,J) &
4731 ,VR2_Z,VR3_Z(:,K),VR4_Z(:,K),VR5_Z(:,K),pcgs(I,K,J) &
4732 ,DEL1IN,DEL2IN,DIV1,DIV2 &
4733 ,FF2R,FF2IN,XI,RIEC,RO2BL &
4734 ,FF3R,FF3IN,XS,RSEC,RO3BL &
4735 ,FF4R,FF4IN,XG,RGEC,RO4BL &
4736 ,FF5R,FF5IN,XH,RHEC,RO5BL &
4737 ,AA1_MY,BB1_MY,AA2_MY,BB2_MY &
4739 ,COL,DTCOND,ICEMAX,NKR &
4740 ,ISYM1,ISYM2,ISYM3,ISYM4,ISYM5,I,J,K,W(i,k,j),DX,Itimestep)
4742 ELSE IF(ISYM1==1 .AND. (TT-273.15)<-0.187 .AND. &
4743 (sum(ISYM2)>1 .OR. ISYM3==1 .OR. ISYM4==1 .OR. ISYM5==1))THEN
4744 IF (TT > 233.15)THEN
4745 VR2_Z(:,1) = VR2_ZC(:,K)
4746 VR2_Z(:,2) = VR2_ZP(:,K)
4747 VR2_Z(:,3) = VR2_ZD(:,K)
4748 CALL ONECOND3(TT,QQ,PP,rhocgs(I,K,J) &
4749 ,VR1_Z(:,K),VR2_Z,VR3_Z(:,K),VR4_Z(:,K),VR5_Z(:,K),pcgs(I,K,J) &
4750 ,DEL1IN,DEL2IN,DIV1,DIV2 &
4751 ,FF1R,FF1IN,XL,RLEC,RO1BL &
4752 ,FF2R,FF2IN,XI,RIEC,RO2BL &
4753 ,FF3R,FF3IN,XS,RSEC,RO3BL &
4754 ,FF4R,FF4IN,XG,RGEC,RO4BL &
4755 ,FF5R,FF5IN,XH,RHEC,RO5BL &
4756 ,AA1_MY,BB1_MY,AA2_MY,BB2_MY &
4758 ,COL,DTCOND,ICEMAX,NKR &
4759 ,ISYM1,ISYM2,ISYM3,ISYM4,ISYM5,I,J,K,W(i,k,j),DX,Itimestep)
4764 END DO ! NCOND - end of NCOND loop
4765 ! +----------------------------------+
4766 ! Collision-Coallescnce
4767 ! +----------------------------------+
4769 IF ( TT >= 233.15 ) THEN
4774 CALL COAL_BOTT_NEW (FF1R,FF2R,FF3R, &
4775 FF4R,FF5R,TT,QQ,PP, &
4776 rhocgs(I,K,J),dt_coll,TCRIT,TTCOAL, &
4777 FLIQFR_SD,FLIQFR_GD,FLIQFR_HD,FRIMFR_SD, &
4779 I,J,K,Itimestep,CollEff_out)
4782 END DO ! NCOLL - end of NCOLL loop
4787 ! in case Sw,Si,mass
4789 ! in case T_OLD(I,K,J).GT.213.15
4791 ! +-------------------------------- +
4792 ! Immediate Freezing
4793 ! +---------------------------------+
4794 IF(T_NEW(i,k,j) < 273.15 .and. ICEPROCS == 1)THEN
4796 (FF1R,XL,FF2R,XI,FF3R,XS,FF4R,XG,FF5R,XH, &
4797 T_NEW(I,K,J),DT,rhocgs(I,K,J), &
4798 COL,AFREEZMY,BFREEZMY,BFREEZMAX, &
4801 ! --------------------------------------------------------------+
4802 ! Jiwen Fan Melting (melting along a constant time scale)
4803 ! --------------------------------------------------------------+
4804 IF (JIWEN_FAN_MELT == 1 .and. T_NEW(i,k,j) > 273.15 .and. ICEPROCS == 1) THEN
4805 CALL J_W_MELT(FF1R,XL,FF2R,XI,FF3R,XS,FF4R,XG,FF5R,XH, &
4806 T_NEW(I,K,J),DT,rhocgs(I,K,J),COL,ICEMAX,NKR)
4811 FF3R(KR)=FF3R(KR) + FF2R(KR,ICE)
4814 if(hail_opt == 1)then
4815 FF5R(KR) = FF5R(KR) + FF4R(KR)
4818 FF4R(KR) = FF4R(KR) + FF5R(KR)
4823 ! +---------------------------+
4824 ! Spontanaous Rain Breakup
4825 ! +----------------------------+
4826 IF (Spont_Rain_BreakUp_On == 1 .AND. (SUM(FF1R) > 43.0*1.0D-30) )THEN
4829 CALL Spont_Rain_BreakUp (DT ,FF1R_D, XL_D, Prob, Gain_Var_New, NND, NKR, ikr_spon_break)
4833 ! -----------------------------------------------------------+
4835 ! -----------------------------------------------------------+
4836 IF (Snow_BreakUp_On == 1 .and. ICEPROCS == 1 .and. sum(FF3R(KR_SNOW_MIN:NKR))> (NKR-KR_SNOW_MIN)*1.0D-30)THEN
4839 FF3R_D(KR) = FF3R(KR)
4841 IF (KR_SNOW_MAX <= NKR) CALL BreakUp_Snow (TT_r,FF3R_D,FLIQFR_SD,xs_d,FRIMFR_SD,NKR)
4843 FF3R(KR) = FF3R_D(KR)
4847 ! Update temperature at the end of MP
4848 th_phy(i,k,j) = t_new(i,k,j)/pi_phy(i,k,j)
4852 DO kr = p_ff1i01,p_ff1i33
4854 chem_new(I,K,J,KR) = FF1R(KRR)
4858 DO kr=p_ff8i01,p_ff8i43
4860 chem_new(I,K,J,KR)=FCCN(KRR)
4862 IF (ICEPROCS == 1)THEN
4865 DO kr=p_ff5i01,p_ff5i33
4867 chem_new(I,K,J,KR)=FF3R(KRR)
4870 if(hail_opt == 1)then
4872 DO KR=p_ff6i01,p_ff6i33
4874 chem_new(I,K,J,KR) = FF5R(KRR)
4878 DO KR=p_ff6i01,p_ff6i33
4880 chem_new(I,K,J,KR) = FF4R(KRR)
4890 ! +-----------------------------+
4891 ! Hydrometeor Sedimentation
4892 ! +-----------------------------+
4897 rhocgs_z(k)=rhocgs(i,k,j)
4898 pcgs_z(k)=pcgs(i,k,j)
4899 zcgs_z(k)=zcgs(i,k,j)
4900 vrx(k,:)=vr1_z3D(:,i,k,j)
4902 do kr=p_ff1i01,p_ff1i33
4904 ffx_z(k,krr)=chem_new(i,k,j,kr)/rhocgs(i,k,j)
4907 call FALFLUXHUCM_Z(ffx_z,VRX,RHOCGS_z,PCGS_z,ZCGS_z,DT,kts,kte,nkr)
4910 do kr=p_ff1i01,p_ff1i33
4912 chem_new(i,k,j,kr)=ffx_z(k,krr)*rhocgs(i,k,j)
4915 if(iceprocs == 1)then
4918 rhocgs_z(k)=rhocgs(i,k,j)
4919 pcgs_z(k)=pcgs(i,k,j)
4920 zcgs_z(k)=zcgs(i,k,j)
4921 vrx(k,:)=vr3_z3D(:,i,k,j)
4923 do kr=p_ff5i01,p_ff5i33
4925 ffx_z(k,krr)=chem_new(i,k,j,kr)/rhocgs(i,k,j)
4928 call FALFLUXHUCM_Z(ffx_z,VRX,RHOCGS_z,PCGS_z,ZCGS_z,DT,kts,kte,nkr)
4931 do kr=p_ff5i01,p_ff5i33
4933 chem_new(i,k,j,kr)=ffx_z(k,krr)*rhocgs(i,k,j)
4936 ! ... Hail or Graupel ...
4938 rhocgs_z(k)=rhocgs(i,k,j)
4939 pcgs_z(k)=pcgs(i,k,j)
4940 zcgs_z(k)=zcgs(i,k,j)
4941 if(hail_opt == 1)then
4942 vrx(k,:) = vr5_z3D(:,i,k,j)
4944 vrx(k,:) = vr4_z3D(:,i,k,j)
4947 do kr=p_ff6i01,p_ff6i33
4949 ffx_z(k,krr)=chem_new(i,k,j,kr)/rhocgs(i,k,j)
4952 call FALFLUXHUCM_Z(ffx_z,VRX,RHOCGS_z,PCGS_z,ZCGS_z,DT,kts,kte,nkr)
4955 do kr=p_ff6i01,p_ff6i33
4957 chem_new(i,k,j,kr)=ffx_z(k,krr)*rhocgs(i,k,j)
4960 end if ! if (iceprocs == 1)
4986 tt = th_phy(i,k,j)*pi_phy(i,k,j)
4990 DO KR = p_ff1i01,p_ff1i33
4992 IF (KRR < KRDROP)THEN
4993 QC(I,K,J) = QC(I,K,J) &
4994 + (1./RHOCGS(I,K,J))*COL*chem_new(I,K,J,KR)*XL(KRR)*XL(KRR)*3
4995 QNC(I,K,J) = QNC(I,K,J) &
4996 + COL*chem_new(I,K,J,KR)*XL(KRR)*3.0/rhocgs(I,K,J)*1000.0 ! #/kg
4998 QR(I,K,J) = QR(I,K,J) &
4999 + (1./RHOCGS(I,K,J))*COL*chem_new(I,K,J,KR)*XL(KRR)*XL(KRR)*3.0
5000 QNR(I,K,J) = QNR(I,K,J) &
5001 + COL*chem_new(I,K,J,KR)*XL(KRR)*3/rhocgs(I,K,J)*1000.0 ! #/kg
5006 IF (ICEPROCS == 1)THEN
5009 DO KR=p_ff5i01,p_ff5i33
5011 if (KRR <= KRICE)THEN
5012 QI(I,K,J) = QI(I,K,J) &
5013 +(1.0/RHOCGS(I,K,J))*COL*chem_new(I,K,J,KR)*XS(KRR)*XS(KRR)*3.0
5014 QNI(I,K,J) = QNI(I,K,J) &
5015 + COL*chem_new(I,K,J,KR)*XS(KRR)*3.0/rhocgs(I,K,J)*1000.0 ! #/kg
5017 QS(I,K,J) = QS(I,K,J) &
5018 + (1.0/RHOCGS(I,K,J))*COL*chem_new(I,K,J,KR)*XS(KRR)*XS(KRR)*3.0
5019 QNS(I,K,J) = QNS(I,K,J) &
5020 + COL*chem_new(I,K,J,KR)*XS(KRR)*3.0/rhocgs(I,K,J)*1000.0 ! #/kg
5024 ! ... Hail / Graupel output
5026 DO KR=p_ff6i01,p_ff6i33
5028 ! ... Hail or Graupel
5029 if(hail_opt == 1)then
5030 QG(I,K,J)=QG(I,K,J) &
5031 +(1.0/RHOCGS(I,K,J))*COL*chem_new(I,K,J,KR)*XH(KRR)*XH(KRR)*3.0
5032 QNG(I,K,J)=QNG(I,K,J) &
5033 +COL*chem_new(I,K,J,KR)*XH(KRR)*3.0/rhocgs(I,K,J)*1000.0 ! #/kg
5035 QG(I,K,J)=QG(I,K,J) &
5036 +(1.0/RHOCGS(I,K,J))*COL*chem_new(I,K,J,KR)*XG(KRR)*XG(KRR)*3.0
5037 QNG(I,K,J)=QNG(I,K,J) &
5038 +COL*chem_new(I,K,J,KR)*XG(KRR)*3.0/rhocgs(I,K,J)*1000.0 ! #/kg
5041 END IF !IF (ICEPROCS.EQ.1)THEN
5044 DO KR = p_ff8i01,p_ff8i43
5046 QNA(I,K,J) = QNA(I,K,J) &
5047 + COL*chem_new(I,K,J,KR)/rhocgs(I,K,J)*1000.0 ! #/kg
5054 998 format(' ',10(f10.1,1x))
5060 GRAUPELNCV(I,J) = 0.0
5062 DO KR=p_ff1i01,p_ff1i33
5064 DELTAW = VR1_Z(KRR,1)
5065 RAINNC(I,J) = RAINNC(I,J) &
5066 +10.0*(3./RO1BL(KRR))*COL*DT*DELTAW* &
5067 chem_new(I,1,J,KR)*XL(KRR)*XL(KRR)
5068 RAINNCV(I,J) = RAINNCV(I,J) &
5069 +10.0*(3./RO1BL(KRR))*COL*DT*DELTAW* &
5070 chem_new(I,1,J,KR)*XL(KRR)*XL(KRR)
5073 DO KR=p_ff5i01,p_ff5i33
5075 DELTAW = VR3_Z(KRR,1)
5076 RAINNC(I,J)=RAINNC(I,J) &
5077 +10.0*(3./RO1BL(KRR))*COL*DT*DELTAW* &
5078 chem_new(I,1,J,KR)*XS(KRR)*XS(KRR)
5079 RAINNCV(I,J)=RAINNCV(I,J) &
5080 +10.0*(3./RO1BL(KRR))*COL*DT*DELTAW* &
5081 chem_new(I,1,J,KR)*XS(KRR)*XS(KRR)
5082 SNOWNC(I,J) = SNOWNC(I,J) &
5083 + 10*(3./RO1BL(KRR))*COL*DT*DELTAW* &
5084 chem_new(I,1,J,KR)*XS(KRR)*XS(KRR)
5085 SNOWNCV(I,J) = SNOWNCV(I,J) &
5086 + 10*(3./RO1BL(KRR))*COL*DT*DELTAW* &
5087 chem_new(I,1,J,KR)*XS(KRR)*XS(KRR)
5090 DO KR=p_ff6i01,p_ff6i33
5092 if(hail_opt == 1)then
5093 DELTAW = VR5_Z(KRR,1)
5094 RAINNC(I,J) = RAINNC(I,J) &
5095 +10.0*(3./RO1BL(KRR))*COL*DT*DELTAW* &
5096 chem_new(I,1,J,KR)*XH(KRR)*XH(KRR)
5097 RAINNCV(I,J) = RAINNCV(I,J) &
5098 +10.0*(3./RO1BL(KRR))*COL*DT*DELTAW* &
5099 chem_new(I,1,J,KR)*XH(KRR)*XH(KRR)
5100 GRAUPELNC(I,J) = GRAUPELNC(I,J) &
5101 + 10*(3./RO1BL(KRR))*COL*DT*DELTAW* &
5102 chem_new(I,1,J,KR)*XH(KRR)*XH(KRR)
5103 GRAUPELNCV(I,J) = GRAUPELNCV(I,J) &
5104 + 10*(3./RO1BL(KRR))*COL*DT*DELTAW* &
5105 chem_new(I,1,J,KR)*XH(KRR)*XH(KRR)
5107 DELTAW = VR4_Z(KRR,1)
5108 RAINNC(I,J) = RAINNC(I,J) &
5109 +10.0*(3./RO1BL(KRR))*COL*DT*DELTAW* &
5110 chem_new(I,1,J,KR)*XG(KRR)*XG(KRR)
5111 RAINNCV(I,J) = RAINNCV(I,J) &
5112 +10.0*(3./RO1BL(KRR))*COL*DT*DELTAW* &
5113 chem_new(I,1,J,KR)*XG(KRR)*XG(KRR)
5114 GRAUPELNC(I,J) = GRAUPELNC(I,J) &
5115 + 10*(3./RO1BL(KRR))*COL*DT*DELTAW* &
5116 chem_new(I,1,J,KR)*XG(KRR)*XG(KRR)
5117 GRAUPELNCV(I,J) = GRAUPELNCV(I,J) &
5118 + 10*(3./RO1BL(KRR))*COL*DT*DELTAW* &
5119 chem_new(I,1,J,KR)*XG(KRR)*XG(KRR)
5122 ! ..........................................
5123 ! ... Polarimetric Forward Radar Operator
5124 ! ..........................................
5125 if ( PRESENT (diagflag) ) then
5126 if( diagflag .and. IPolar_HUCM .and. (sbm_diagnostics==1) ) then
5131 zmks_1d(k) = zcgs(i,k,j)*0.01
5133 DIST_SING = ((i-ide/2)**2+(j-jde/2)**2)**(0.5)
5143 BKDEN_Snow(:) = RO3BL(:)
5144 RO2BL_D(:,:) = RO2BL(:,:)
5145 RO2BL_D(:,:) = RO2BL(:,:)
5149 do kr = p_ff1i01,p_ff1i33
5151 FF1R_D(KRR) = (1./RHOCGS(I,K,J))*chem_new(I,K,J,KR)*XL(KRR)*XL(KRR)*3.0
5152 if (FF1R_D(KRR) < 1.0D-20) FF1R_D(KRR) = 0.0
5154 if (ICEPROCS == 1)then
5157 do kr=p_ff5i01,p_ff5i33
5159 FF3R_D(KRR)=(1./RHOCGS(I,K,J))*chem_new(I,K,J,KR)*XS(KRR)*XS(KRR)*3.0
5160 FF3R (KRR) = chem_new(I,K,J,KR)
5161 if (ff3r_D(krr) < 1.0D-20) ff3r_D(krr) = 0.0
5163 ! ... Graupel or Hail
5165 if(hail_opt == 0)then
5166 do kr = p_ff6i01,p_ff6i33
5168 FF4R_D(KRR) = (1./RHOCGS(I,K,J))*chem_new(I,K,J,KR)*XG(KRR)*XG(KRR)*3.0
5169 FF4R(KRR) = chem_new(I,K,J,KR)
5170 if (FF4R_D(KRR) < 1.0D-20) FF4R_D(KRR)= 0.0
5174 do kr=p_ff6i01,p_ff6i33
5176 FF5R_D(KRR)=(1./RHOCGS(I,K,J))*chem_new(I,K,J,KR)*XH(KRR)*XH(KRR)*3.0
5177 FF5R(KRR)=chem_new(I,K,J,KR)
5178 if (ff5r_d(krr) < 1.0D-20) ff5r_d(krr)=0.0
5182 ! in caseICEPROCS.EQ.1
5185 rhocgs_d = rhocgs(I,K,J)
5186 T_NEW_D = T_NEW(I,K,J)
5192 (FF1R_D, FF2R_D, FF3R_D, FF4R_D, FF5R_D, FF1_FD, &
5193 FLIQFR_SD, FLIQFR_GD, FLIQFR_HD, FL1_FD, &
5194 BKDEN_Snow, T_NEW_D, rhocgs_D, wavelength, iwl, &
5195 distance, dx_dbl, dy_dbl, zmks_1d, &
5196 out1, out2, out3, out4, out5, out6, out7, out8, out9, &
5197 bin_mass, tab_colum, tab_dendr, tab_snow, bin_log, &
5198 ijk, i, j, k, kts, kte, NKR, ICEMAX, icloud, itimestep, &
5199 faf1,fbf1,fab1,fbb1, &
5200 faf3,fbf3,fab3,fbb3, &
5201 faf4,fbf4,fab4,fbb4, &
5202 faf5,fbf5,fab5,fbb5, &
5203 temps_water,temps_fd,temps_crystals, &
5204 temps_snow,temps_graupel,temps_hail, &
5205 fws_fd,fws_crystals,fws_snow, &
5206 fws_graupel,fws_hail,usetables)
5210 DO KR=r_p_ff1i01,r_p_ff1i06
5212 sbmradar(I,K,J,KR) = out1(KRR)
5215 DO KR=r_p_ff2i01,r_p_ff2i06
5217 sbmradar(I,K,J,KR)=out2(KRR)
5220 DO KR=r_p_ff3i01,r_p_ff3i06
5222 sbmradar(I,K,J,KR)=out3(KRR)
5225 DO KR=r_p_ff4i01,r_p_ff4i06
5227 sbmradar(I,K,J,KR)=out4(KRR)
5230 DO KR=r_p_ff5i01,r_p_ff5i06
5232 sbmradar(I,K,J,KR)=out5(KRR)
5235 DO KR=r_p_ff6i01,r_p_ff6i06
5237 sbmradar(I,K,J,KR)=out6(KRR)
5240 DO KR=r_p_ff7i01,r_p_ff7i06
5242 sbmradar(I,K,J,KR)=out7(KRR)
5245 DO KR=r_p_ff8i01,r_p_ff8i06
5247 sbmradar(I,K,J,KR)=out8(KRR)
5250 DO KR=r_p_ff9i01,r_p_ff9i06
5252 sbmradar(I,K,J,KR)=out9(KRR)
5257 ! diagflag .and. IPolar_HUCM
5270 th_old(i,k,j)=th_phy(i,k,j)
5271 qv_old(i,k,j)=qv(i,k,j)
5280 rhocgs(I,K,J)=rho_phy(I,K,J)*0.001
5282 DO KR=p_ff1i01,p_ff1i33
5284 chem_new(I,K,J,KR)=chem_new(I,K,J,KR)/RHOCGS(I,K,J)*COL*XL(KRR)*XL(KRR)*3.0
5285 if (qc(i,k,j)+qr(i,k,j).lt.1.e-13)chem_new(I,K,J,KR)=0.0
5288 DO KR=p_ff5i01,p_ff5i33
5290 chem_new(I,K,J,KR)=chem_new(I,K,J,KR)/RHOCGS(I,K,J)*COL*XS(KRR)*XS(KRR)*3.0
5291 if (qs(i,k,j).lt.1.e-13)chem_new(I,K,J,KR)=0.0
5295 DO KR=p_ff8i01,p_ff8i43
5297 chem_new(I,K,J,KR)=chem_new(I,K,J,KR)/RHOCGS(I,K,J)*1000.0
5299 ! ... Hail / Graupel
5300 if(hail_opt == 1)then
5302 DO KR=p_ff6i01,p_ff6i33
5304 chem_new(I,K,J,KR)=chem_new(I,K,J,KR)/RHOCGS(I,K,J)*COL*XH(KRR)*XH(KRR)*3.0
5305 if (qg(i,k,j) < 1.e-13) chem_new(I,K,J,KR) = 0.0
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*XG(KRR)*XG(KRR)*3.0
5312 if (qg(i,k,j) < 1.e-13) chem_new(I,K,J,KR) = 0.0
5322 END SUBROUTINE FAST_SBM
5323 ! +-------------------------------------------------------------+
5324 SUBROUTINE FALFLUXHUCM_Z(chem_new,VR1,RHOCGS,PCGS,ZCGS,DT, &
5329 integer,intent(in) :: kts,kte,nkr
5330 real(kind=r4size),intent(inout) :: chem_new(:,:)
5331 real(kind=r4size),intent(in) :: rhocgs(:),pcgs(:),zcgs(:),VR1(:,:),DT
5335 real(kind=r4size) :: TFALL,DTFALL,VFALL(KTE),DWFLUX(KTE)
5336 integer :: IFALL,N,NSUB
5338 ! FALLING FLUXES FOR EACH KIND OF CLOUD PARTICLES: C.G.S. UNIT
5339 ! ADAPTED FROM GSFC CODE FOR HUCM
5340 ! The flux at k=1 is assumed to be the ground so FLUX(1) is the
5341 ! flux into the ground. DWFLUX(1) is at the lowest half level where
5342 ! Q(1) etc are defined. The formula for FLUX(1) uses Q(1) etc which
5343 ! is actually half a grid level above it. This is what is meant by
5344 ! an upstream method. Upstream in this case is above because the
5345 ! velocity is downwards.
5346 ! USE UPSTREAM METHOD (VFALL IS POSITIVE)
5351 IF(chem_new(K,KR).GE.1.E-20)IFALL=1
5356 ! [KS] VFALL(K) = VR1(K,KR)*SQRT(1.E6/PCGS(K))
5357 VFALL(K) = VR1(K,KR) ! ... [KS] : The pressure effect is taken into account at the beggining of the calculations
5358 TFALL=AMIN1(TFALL,ZCGS(K)/(VFALL(K)+1.E-20))
5360 IF(TFALL.GE.1.E10)STOP
5361 NSUB=(INT(2.0*DT/TFALL)+1)
5366 DWFLUX(K)=-(RHOCGS(K)*VFALL(K)*chem_new(k,kr)- &
5368 VFALL(K+1)*chem_new(K+1,KR))/(RHOCGS(K)*(ZCGS(K+1)- &
5371 ! NO Z ABOVE TOP, SO USE THE SAME DELTAZ
5372 DWFLUX(KTE)=-(RHOCGS(KTE)*VFALL(KTE)* &
5373 & chem_new(kte,kr))/(RHOCGS(KTE)*(ZCGS(KTE)-ZCGS(KTE-1)))
5375 chem_new(k,kr)=chem_new(k,kr)+DWFLUX(K)*DTFALL
5382 END SUBROUTINE FALFLUXHUCM_Z
5383 ! +----------------------------------+
5384 SUBROUTINE FAST_HUCMINIT(DT)
5386 USE module_mp_SBM_BreakUp,ONLY:Spontanous_Init
5387 USE module_mp_SBM_Collision,ONLY:courant_bott_KS
5393 real(kind=r4size),intent(in) :: DT
5395 LOGICAL , EXTERNAL :: wrf_dm_on_monitor
5397 CHARACTER*80 errmess
5398 integer :: I,J,KR,IType,HUJISBM_UNIT1
5399 real(kind=r4size) :: dlnr,ax,deg01,CONCCCNIN,CONTCCNIN
5401 character(len=256),parameter :: dir_43 = "SBM_input_43", dir_33 = "SBM_input_33"
5402 character(len=256) :: input_dir,Fname
5404 if(nkr == 33) input_dir = trim(dir_33)
5405 if(nkr == 43) input_dir = trim(dir_43)
5407 call wrf_message(" FAST SBM: INITIALIZING WRF_HUJISBM ")
5408 call wrf_message(" FAST SBM: ****** WRF_HUJISBM ******* ")
5411 ! +-------------------------------------------------------+
5412 if (.NOT. ALLOCATED(bin_mass)) ALLOCATE(bin_mass(nkr))
5413 if (.NOT. ALLOCATED(tab_colum)) ALLOCATE(tab_colum(nkr))
5414 if (.NOT. ALLOCATED(tab_dendr)) ALLOCATE(tab_dendr(nkr))
5415 if (.NOT. ALLOCATED(tab_snow)) ALLOCATE(tab_snow(nkr))
5416 if (.NOT. ALLOCATED(bin_log)) ALLOCATE(bin_log(nkr))
5418 dlnr=dlog(2.d0)/(3.d0)
5421 IF ( wrf_dm_on_monitor() ) THEN
5423 INQUIRE ( i , OPENED = opened )
5424 IF ( .NOT. opened ) THEN
5432 #if (defined(DM_PARALLEL))
5433 CALL wrf_dm_bcast_bytes( hujisbm_unit1 , IWORDSIZE )
5435 IF ( hujisbm_unit1 < 0 ) THEN
5436 CALL wrf_error_fatal ( 'module_mp_FAST-SBM: Table-1 -- FAST_SBM_INIT: '// &
5437 'Can not find unused fortran unit to read in lookup table, model stop' )
5440 IF ( wrf_dm_on_monitor() ) THEN
5441 WRITE(errmess, '(A,I2)') 'module_mp_FAST-SBM : Table-1 -- opening "BLKD_SDC.dat" on unit',hujisbm_unit1
5442 CALL wrf_debug(150, errmess)
5443 OPEN(UNIT=hujisbm_unit1,FILE=trim(input_dir)//"/BLKD_SDC.dat",FORM="FORMATTED",STATUS="OLD",ERR=2070)
5445 READ(hujisbm_unit1,*) bin_mass(kr),tab_colum(kr),tab_dendr(kr),tab_snow(kr)
5446 bin_log(kr) = log10(bin_mass(kr))
5450 #define DM_BCAST_MACRO_R4(A) CALL wrf_dm_bcast_bytes(A, size(A)*R4SIZE)
5451 #define DM_BCAST_MACRO_R8(A) CALL wrf_dm_bcast_bytes(A, size(A)*R8SIZE)
5452 #define DM_BCAST_MACRO_R16(A) CALL wrf_dm_bcast_bytes(A, size(A)*R16SIZE)
5454 #if (defined(DM_PARALLEL))
5455 DM_BCAST_MACRO_R8(bin_mass)
5456 DM_BCAST_MACRO_R8(tab_colum)
5457 DM_BCAST_MACRO_R8(tab_dendr)
5458 DM_BCAST_MACRO_R8(tab_snow)
5459 DM_BCAST_MACRO_R8(bin_log)
5462 WRITE(errmess, '(A,I2)') 'FAST_SBM_INIT : succesfull reading Table-1'
5463 CALL wrf_debug(000, errmess)
5464 ! +-----------------------------------------------------------------------+
5467 ! +----------------------------------------------+
5468 if (.NOT. ALLOCATED(RLEC)) ALLOCATE(RLEC(nkr))
5469 if (.NOT. ALLOCATED(RIEC)) ALLOCATE(RIEC(nkr,icemax))
5470 if (.NOT. ALLOCATED(RSEC)) ALLOCATE(RSEC(nkr))
5471 if (.NOT. ALLOCATED(RGEC)) ALLOCATE(RGEC(nkr))
5472 if (.NOT. ALLOCATED(RHEC)) ALLOCATE(RHEC(nkr))
5475 IF ( wrf_dm_on_monitor() ) THEN
5477 INQUIRE ( i , OPENED = opened )
5478 IF ( .NOT. opened ) THEN
5486 #if (defined(DM_PARALLEL))
5487 CALL wrf_dm_bcast_bytes ( hujisbm_unit1 , IWORDSIZE )
5489 IF ( hujisbm_unit1 < 0 ) THEN
5490 CALL wrf_error_fatal ( 'module_mp_FAST-SBM: Table-2 -- FAST_SBM_INIT: '// &
5491 'Can not find unused fortran unit to read in lookup table,model stop' )
5494 IF ( wrf_dm_on_monitor() ) THEN
5495 WRITE(errmess, '(A,I2)') 'module_mp_FAST-SBM : Table-2 -- opening capacity.asc on unit',hujisbm_unit1
5496 CALL wrf_debug(150, errmess)
5497 OPEN(UNIT=hujisbm_unit1,FILE=trim(input_dir)//"/capacity33.asc",FORM="FORMATTED",STATUS="OLD",ERR=2070)
5498 !OPEN(UNIT=hujisbm_unit1,FILE=trim(input_dir)//"/capacity43.asc",FORM="FORMATTED",STATUS="OLD",ERR=2070)
5500 READ(hujisbm_unit1,900) RLEC,RIEC,RSEC,RGEC,RHEC
5503 #if (defined(DM_PARALLEL))
5504 DM_BCAST_MACRO_R4(RLEC)
5505 DM_BCAST_MACRO_R4(RIEC)
5506 DM_BCAST_MACRO_R4(RSEC)
5507 DM_BCAST_MACRO_R4(RGEC)
5508 DM_BCAST_MACRO_R4(RHEC)
5511 WRITE(errmess, '(A,I2)') 'FAST_SBM_INIT : succesfull reading Table-2'
5512 CALL wrf_debug(000, errmess)
5513 ! +----------------------------------------------------------------------+
5516 ! +-----------------------------------------------+
5517 if (.NOT. ALLOCATED(XL)) ALLOCATE(XL(nkr))
5518 if (.NOT. ALLOCATED(XI)) ALLOCATE(XI(nkr,icemax))
5519 if (.NOT. ALLOCATED(XS)) ALLOCATE(XS(nkr))
5520 if (.NOT. ALLOCATED(XG)) ALLOCATE(XG(nkr))
5521 if (.NOT. ALLOCATED(XH)) ALLOCATE(XH(nkr))
5524 IF ( wrf_dm_on_monitor() ) THEN
5526 INQUIRE ( i , OPENED = opened )
5527 IF ( .NOT. opened ) THEN
5535 #if (defined(DM_PARALLEL))
5536 CALL wrf_dm_bcast_bytes ( hujisbm_unit1, IWORDSIZE )
5539 IF ( hujisbm_unit1 < 0 ) THEN
5540 CALL wrf_error_fatal ( 'module_mp_FAST_SBM: Table-3 -- FAST_SBM_INIT: '// &
5541 'Can not find unused fortran unit to read in lookup table,model stop' )
5543 IF ( wrf_dm_on_monitor() ) THEN
5544 WRITE(errmess, '(A,I2)') 'module_mp_FAST_SBM : Table-3 -- opening masses.asc on unit ',hujisbm_unit1
5545 CALL wrf_debug(150, errmess)
5546 OPEN(UNIT=hujisbm_unit1,FILE=trim(input_dir)//"/masses33.asc",FORM="FORMATTED",STATUS="OLD",ERR=2070)
5547 !OPEN(UNIT=hujisbm_unit1,FILE=trim(input_dir)//"/masses43.asc",FORM="FORMATTED",STATUS="OLD",ERR=2070)
5548 READ(hujisbm_unit1,900) XL,XI,XS,XG,XH
5549 CLOSE(hujisbm_unit1)
5552 #if (defined(DM_PARALLEL))
5553 DM_BCAST_MACRO_R4(XL)
5554 DM_BCAST_MACRO_R4(XI)
5555 DM_BCAST_MACRO_R4(XS)
5556 DM_BCAST_MACRO_R4(XG)
5557 DM_BCAST_MACRO_R4(XH)
5560 WRITE(errmess, '(A,I2)') 'FAST_SBM_INIT : succesfull reading Table-3'
5561 CALL wrf_debug(000, errmess)
5562 ! +-------------------------------------------------------------------------+
5565 ! TERMINAL VELOSITY :
5566 ! +---------------------------------------------------+
5567 if (.NOT. ALLOCATED(VR1)) ALLOCATE(VR1(nkr))
5568 if (.NOT. ALLOCATED(VR2)) ALLOCATE(VR2(nkr,icemax))
5569 if (.NOT. ALLOCATED(VR3)) ALLOCATE(VR3(nkr))
5570 if (.NOT. ALLOCATED(VR4)) ALLOCATE(VR4(nkr))
5571 if (.NOT. ALLOCATED(VR5)) ALLOCATE(VR5(nkr))
5574 IF ( wrf_dm_on_monitor() ) THEN
5576 INQUIRE ( i , OPENED = opened )
5577 IF ( .NOT. opened ) THEN
5585 #if (defined(DM_PARALLEL))
5586 CALL wrf_dm_bcast_bytes ( hujisbm_unit1 , IWORDSIZE )
5588 IF ( hujisbm_unit1 < 0 ) THEN
5589 CALL wrf_error_fatal ( 'module_mp_FAST_SBM: Table-4 -- FAST_SBM_INIT: '// &
5590 'Can not find unused fortran unit to read in lookup table,model stop' )
5593 IF ( wrf_dm_on_monitor() ) THEN
5594 WRITE(errmess, '(A,I2)') 'module_mp_FAST_SBM : Table-4 -- opening termvels.asc on unit ',hujisbm_unit1
5595 CALL wrf_debug(150, errmess)
5596 OPEN(UNIT=hujisbm_unit1,FILE=trim(input_dir)//"/termvels33_corrected.asc",FORM="FORMATTED",STATUS="OLD",ERR=2070)
5597 !OPEN(UNIT=hujisbm_unit1,FILE=trim(input_dir)//"/termvels43_corrected.asc",FORM="FORMATTED",STATUS="OLD",ERR=2070)
5598 READ(hujisbm_unit1,900) VR1,VR2,VR3,VR4,VR5
5599 CLOSE(hujisbm_unit1)
5602 #if (defined(DM_PARALLEL))
5603 DM_BCAST_MACRO_R4(VR1)
5604 DM_BCAST_MACRO_R4(VR2)
5605 DM_BCAST_MACRO_R4(VR3)
5606 DM_BCAST_MACRO_R4(VR4)
5607 DM_BCAST_MACRO_R4(VR5)
5609 WRITE(errmess, '(A,I2)') 'FAST_SBM_INIT : succesfull reading Table-4'
5610 CALL wrf_debug(000, errmess)
5611 ! +----------------------------------------------------------------------+
5616 ! +---------------------------------------------------+
5617 if (.NOT. ALLOCATED(SLIC)) ALLOCATE(SLIC(nkr,6))
5618 if (.NOT. ALLOCATED(TLIC)) ALLOCATE(TLIC(nkr,2))
5619 if (.NOT. ALLOCATED(COEFIN)) ALLOCATE(COEFIN(nkr))
5622 IF ( wrf_dm_on_monitor() ) THEN
5624 INQUIRE ( i , OPENED = opened )
5625 IF ( .NOT. opened ) THEN
5634 #if (defined(DM_PARALLEL))
5635 CALL wrf_dm_bcast_bytes ( hujisbm_unit1 , IWORDSIZE )
5638 IF ( hujisbm_unit1 < 0 ) THEN
5639 CALL wrf_error_fatal ( 'module_mp_FAST_SBM: Table-5 -- FAST_SBM_INIT: '// &
5640 'Can not find unused fortran unit to read in lookup table,model stop' )
5643 IF ( wrf_dm_on_monitor() ) THEN
5644 WRITE(errmess, '(A,I2)') 'module_mp_FAST_SBM : Table-5 -- opening constants.asc on unit ',hujisbm_unit1
5645 CALL wrf_debug(150, errmess)
5646 OPEN(UNIT=hujisbm_unit1,FILE=trim(input_dir)//"/constants33.asc",FORM="FORMATTED",STATUS="OLD",ERR=2070)
5647 !OPEN(UNIT=hujisbm_unit1,FILE=trim(input_dir)//"/constants43.asc",FORM="FORMATTED",STATUS="OLD",ERR=2070)
5648 READ(hujisbm_unit1,900) SLIC,TLIC,COEFIN
5649 CLOSE(hujisbm_unit1)
5652 #if (defined(DM_PARALLEL))
5653 DM_BCAST_MACRO_R4(SLIC)
5654 DM_BCAST_MACRO_R4(TLIC)
5655 DM_BCAST_MACRO_R4(COEFIN)
5657 WRITE(errmess, '(A,I2)') 'FAST_SBM_INIT : succesfull reading Table-5'
5658 CALL wrf_debug(000, errmess)
5659 ! +----------------------------------------------------------------------+
5662 ! KERNELS DEPENDING ON PRESSURE :
5663 ! +------------------------------------------------------------------+
5664 if (.NOT. ALLOCATED(YWLL_1000MB)) ALLOCATE(YWLL_1000MB(nkr,nkr))
5665 if (.NOT. ALLOCATED(YWLL_750MB)) ALLOCATE(YWLL_750MB(nkr,nkr))
5666 if (.NOT. ALLOCATED(YWLL_500MB)) ALLOCATE(YWLL_500MB(nkr,nkr))
5669 IF ( wrf_dm_on_monitor() ) THEN
5671 INQUIRE ( i , OPENED = opened )
5672 IF ( .NOT. opened ) THEN
5681 #if (defined(DM_PARALLEL))
5682 CALL wrf_dm_bcast_bytes ( hujisbm_unit1 , IWORDSIZE )
5684 IF ( hujisbm_unit1 < 0 ) THEN
5685 CALL wrf_error_fatal ( 'module_mp_FAST_SBM: Table-6 -- FAST_SBM_INIT: '// &
5686 'Can not find unused fortran unit to read in lookup table,model stop' )
5688 IF ( wrf_dm_on_monitor() ) THEN
5689 WRITE(errmess, '(A,I2)') 'module_mp_FAST_SBM : Table-6 -- opening kernels_z.asc on unit ',hujisbm_unit1
5690 CALL wrf_debug(150, errmess)
5691 Fname = trim(input_dir)//'/kernLL_z33.asc'
5692 !Fname = trim(input_dir)//'/kernLL_z43.asc'
5693 OPEN(UNIT=hujisbm_unit1,FILE=Fname,FORM="FORMATTED",STATUS="OLD",ERR=2070)
5694 READ(hujisbm_unit1,900) YWLL_1000MB,YWLL_750MB,YWLL_500MB
5695 CLOSE(hujisbm_unit1)
5700 IF(I > 33 .OR. J > 33) THEN
5701 YWLL_1000MB(I,J) = 0.0
5702 YWLL_750MB(I,J) = 0.0
5703 YWLL_500MB(I,J) = 0.0
5708 #if (defined(DM_PARALLEL))
5709 DM_BCAST_MACRO_R4(YWLL_1000MB)
5710 DM_BCAST_MACRO_R4(YWLL_750MB)
5711 DM_BCAST_MACRO_R4(YWLL_500MB)
5714 WRITE(errmess, '(A,I2)') 'FAST_SBM_INIT : succesfull reading Table-6'
5715 CALL wrf_debug(000, errmess)
5716 ! +-----------------------------------------------------------------------+
5719 ! COLLISIONS KERNELS :
5720 ! +-----------------------------------------------------------------------+
5722 if (.NOT. ALLOCATED(YWLI_300MB)) ALLOCATE(YWLI_300MB(nkr,nkr,icemax))
5723 if (.NOT. ALLOCATED(YWLI_500MB)) ALLOCATE(YWLI_500MB(nkr,nkr,icemax))
5724 if (.NOT. ALLOCATED(YWLI_750MB)) ALLOCATE(YWLI_750MB(nkr,nkr,icemax))
5726 ! ... Drops - Graupel
5727 if (.NOT. ALLOCATED(YWLG_300MB)) ALLOCATE(YWLG_300MB(nkr,nkr))
5728 if (.NOT. ALLOCATED(YWLG_500MB)) ALLOCATE(YWLG_500MB(nkr,nkr))
5729 if (.NOT. ALLOCATED(YWLG_750MB)) ALLOCATE(YWLG_750MB(nkr,nkr))
5730 !if (.NOT. ALLOCATED(YWLG)) ALLOCATE(YWLG(nkr,nkr))
5733 if (.NOT. ALLOCATED(YWLH_300MB)) ALLOCATE(YWLH_300MB(nkr,nkr))
5734 if (.NOT. ALLOCATED(YWLH_500MB)) ALLOCATE(YWLH_500MB(nkr,nkr))
5735 if (.NOT. ALLOCATED(YWLH_750MB)) ALLOCATE(YWLH_750MB(nkr,nkr))
5738 if (.NOT. ALLOCATED(YWLS_300MB)) ALLOCATE(YWLS_300MB(nkr,nkr))
5739 if (.NOT. ALLOCATED(YWLS_500MB)) ALLOCATE(YWLS_500MB(nkr,nkr))
5740 if (.NOT. ALLOCATED(YWLS_750MB)) ALLOCATE(YWLS_750MB(nkr,nkr))
5743 if (.NOT. ALLOCATED(YWII_300MB)) ALLOCATE(YWII_300MB(nkr,nkr,icemax,icemax))
5744 if (.NOT. ALLOCATED(YWII_500MB)) ALLOCATE(YWII_500MB(nkr,nkr,icemax,icemax))
5745 if (.NOT. ALLOCATED(YWII_750MB)) ALLOCATE(YWII_750MB(nkr,nkr,icemax,icemax))
5748 if (.NOT. ALLOCATED(YWIS_300MB)) ALLOCATE(YWIS_300MB(nkr,nkr,icemax))
5749 if (.NOT. ALLOCATED(YWIS_500MB)) ALLOCATE(YWIS_500MB(nkr,nkr,icemax))
5750 if (.NOT. ALLOCATED(YWIS_750MB)) ALLOCATE(YWIS_750MB(nkr,nkr,icemax))
5752 ! ... Snow - Graupel
5753 if (.NOT. ALLOCATED(YWSG_300MB)) ALLOCATE(YWSG_300MB(nkr,nkr))
5754 if (.NOT. ALLOCATED(YWSG_500MB)) ALLOCATE(YWSG_500MB(nkr,nkr))
5755 if (.NOT. ALLOCATED(YWSG_750MB)) ALLOCATE(YWSG_750MB(nkr,nkr))
5758 if (.NOT. ALLOCATED(YWSS_300MB)) ALLOCATE(YWSS_300MB(nkr,nkr))
5759 if (.NOT. ALLOCATED(YWSS_500MB)) ALLOCATE(YWSS_500MB(nkr,nkR))
5760 if (.NOT. ALLOCATED(YWSS_750MB)) ALLOCATE(YWSS_750MB(nkr,nkr))
5763 IF ( wrf_dm_on_monitor() ) THEN
5765 INQUIRE ( i , OPENED = opened )
5766 IF ( .NOT. opened ) THEN
5774 #if (defined(DM_PARALLEL))
5775 CALL wrf_dm_bcast_bytes ( hujisbm_unit1 , IWORDSIZE )
5777 IF ( hujisbm_unit1 < 0 ) THEN
5778 CALL wrf_error_fatal ( 'module_mp_FAST_SBM: Table-7 -- FAST_SBM_INIT: '// &
5779 'Can not find unused fortran unit to read in lookup table,model stop' )
5781 ! ... KERNELS DEPENDING ON PRESSURE :
5782 IF ( wrf_dm_on_monitor() ) THEN
5783 WRITE(errmess, '(A,I2)') 'module_mp_WRFsbm : Table-7 -- opening kernels33.asc on unit',hujisbm_unit1
5784 CALL wrf_debug(150, errmess)
5787 !Fname = trim(input_dir)//'/ckli_300mb_As'
5788 !OPEN(UNIT=hujisbm_unit1,FILE=Fname,FORM="FORMATTED",STATUS="OLD",ERR=2070)
5789 !READ(hujisbm_unit1,900) YWLI_300MB
5790 !Fname = trim(input_dir)//'/ckli_500mb_As'
5791 !OPEN(UNIT=hujisbm_unit1,FILE=Fname,FORM="FORMATTED",STATUS="OLD",ERR=2070)
5792 !READ(hujisbm_unit1,900) YWLI_500MB
5793 !Fname = trim(input_dir)//'/ckli_750mb_As'
5794 !OPEN(UNIT=hujisbm_unit1,FILE=Fname,FORM="FORMATTED",STATUS="OLD",ERR=2070)
5795 !READ(hujisbm_unit1,900) YWLI_750MB
5797 Fname = trim(input_dir)//'/ckli_33_300mb_500mb_750mb.asc'
5798 OPEN(UNIT=hujisbm_unit1,FILE=Fname,FORM="FORMATTED",STATUS="OLD",ERR=2070)
5799 READ(hujisbm_unit1,900) YWLI_300MB,YWLI_500MB,YWLI_750MB
5800 CLOSE(hujisbm_unit1)
5802 ! ... Drop - Graupel
5803 !Fname = trim(input_dir)//'/cklg_300mb_As'
5804 !OPEN(UNIT=hujisbm_unit1,FILE=Fname,FORM="FORMATTED",STATUS="OLD",ERR=2070)
5805 !READ(hujisbm_unit1,900) YWLG_300MB
5806 !Fname = trim(input_dir)//'/cklg_500mb_As'
5807 !OPEN(UNIT=hujisbm_unit1,FILE=Fname,FORM="FORMATTED",STATUS="OLD",ERR=2070)
5808 !READ(hujisbm_unit1,900) YWLG_500MB
5809 !Fname = trim(input_dir)//'/cklg_750mb_As'
5810 !OPEN(UNIT=hujisbm_unit1,FILE=Fname,FORM="FORMATTED",STATUS="OLD",ERR=2070)
5811 !READ(hujisbm_unit1,900) YWLG_750MB
5813 Fname = trim(input_dir)//'/cklg_33_300mb_500mb_750mb.asc'
5814 OPEN(UNIT=hujisbm_unit1,FILE=Fname,FORM="FORMATTED",STATUS="OLD",ERR=2070)
5815 READ(hujisbm_unit1,900) YWLG_300MB,YWLG_500MB,YWLG_750MB
5816 CLOSE(hujisbm_unit1)
5819 !Fname = trim(input_dir)//'/cklh_300mb_As'
5820 !OPEN(UNIT=hujisbm_unit1,FILE=Fname,FORM="FORMATTED",STATUS="OLD",ERR=2070)
5821 !READ(hujisbm_unit1,900) YWLH_300MB
5822 !Fname = trim(input_dir)//'/cklh_500mb_As'
5823 !OPEN(UNIT=hujisbm_unit1,FILE=Fname,FORM="FORMATTED",STATUS="OLD",ERR=2070)
5824 !READ(hujisbm_unit1,900) YWLH_500MB
5825 !Fname = trim(input_dir)//'/cklh_750mb_As'
5826 !OPEN(UNIT=hujisbm_unit1,FILE=Fname,FORM="FORMATTED",STATUS="OLD",ERR=2070)
5827 !READ(hujisbm_unit1,900) YWLH_750MB
5829 Fname = trim(input_dir)//'/cklh_33_300mb_500mb_750mb.asc'
5830 OPEN(UNIT=hujisbm_unit1,FILE=Fname,FORM="FORMATTED",STATUS="OLD",ERR=2070)
5831 READ(hujisbm_unit1,900) YWLH_300MB,YWLH_500MB,YWLH_750MB
5832 CLOSE(hujisbm_unit1)
5835 !Fname = trim(input_dir)//'/ckls_300mb_As'
5836 !OPEN(UNIT=hujisbm_unit1,FILE=Fname,FORM="FORMATTED",STATUS="OLD",ERR=2070)
5837 !READ(hujisbm_unit1,900) YWLS_300MB
5838 !Fname = trim(input_dir)//'/ckls_500mb_As'
5839 !OPEN(UNIT=hujisbm_unit1,FILE=Fname,FORM="FORMATTED",STATUS="OLD",ERR=2070)
5840 !READ(hujisbm_unit1,900) YWLS_500MB
5841 !Fname = trim(input_dir)//'/ckls_750mb_As'
5842 !OPEN(UNIT=hujisbm_unit1,FILE=Fname,FORM="FORMATTED",STATUS="OLD",ERR=2070)
5843 !READ(hujisbm_unit1,900) YWLS_750MB
5845 Fname = trim(input_dir)//'/ckls_33_300mb_500mb_750mb.asc'
5846 OPEN(UNIT=hujisbm_unit1,FILE=Fname,FORM="FORMATTED",STATUS="OLD",ERR=2070)
5847 READ(hujisbm_unit1,900) YWLS_300MB,YWLS_500MB,YWLS_750MB
5848 CLOSE(hujisbm_unit1)
5851 !Fname = trim(input_dir)//'/ckii_300mb_As'
5852 !OPEN(UNIT=hujisbm_unit1,FILE=Fname,FORM="FORMATTED",STATUS="OLD",ERR=2070)
5853 !READ(hujisbm_unit1,900) YWII_300MB
5854 !Fname = trim(input_dir)//'/ckii_500mb_As'
5855 !OPEN(UNIT=hujisbm_unit1,FILE=Fname,FORM="FORMATTED",STATUS="OLD",ERR=2070)
5856 !READ(hujisbm_unit1,900) YWII_500MB
5857 !Fname = trim(input_dir)//'/ckii_750mb_As'
5858 !OPEN(UNIT=hujisbm_unit1,FILE=Fname,FORM="FORMATTED",STATUS="OLD",ERR=2070)
5859 !READ(hujisbm_unit1,900) YWII_750MB
5860 !CLOSE(hujisbm_unit1)
5862 Fname = trim(input_dir)//'/ckii_33_300mb_500mb_750mb.asc'
5863 OPEN(UNIT=hujisbm_unit1,FILE=Fname,FORM="FORMATTED",STATUS="OLD",ERR=2070)
5864 READ(hujisbm_unit1,900) YWII_300MB,YWII_500MB,YWII_750MB
5865 CLOSE(hujisbm_unit1)
5868 !Fname = trim(input_dir)//'/ckis_300mb_As'
5869 !OPEN(UNIT=hujisbm_unit1,FILE=Fname,FORM="FORMATTED",STATUS="OLD",ERR=2070)
5870 !READ(hujisbm_unit1,900) YWIS_300MB
5871 !Fname = trim(input_dir)//'/ckis_500mb_As'
5872 !OPEN(UNIT=hujisbm_unit1,FILE=Fname,FORM="FORMATTED",STATUS="OLD",ERR=2070)
5873 !READ(hujisbm_unit1,900) YWIS_500MB
5874 !Fname = trim(input_dir)//'/ckis_750mb_As'
5875 !OPEN(UNIT=hujisbm_unit1,FILE=Fname,FORM="FORMATTED",STATUS="OLD",ERR=2070)
5876 !READ(hujisbm_unit1,900) YWIS_750MB
5878 Fname = trim(input_dir)//'/ckis_33_300mb_500mb_750mb.asc'
5879 OPEN(UNIT=hujisbm_unit1,FILE=Fname,FORM="FORMATTED",STATUS="OLD",ERR=2070)
5880 READ(hujisbm_unit1,900) YWIS_300MB,YWIS_500MB,YWIS_750MB
5881 CLOSE(hujisbm_unit1)
5883 ! ... Snow - Graupel
5884 !Fname = trim(input_dir)//'/cksg_300mb_As'
5885 !OPEN(UNIT=hujisbm_unit1,FILE=Fname,FORM="FORMATTED",STATUS="OLD",ERR=2070)
5886 !READ(hujisbm_unit1,900) YWSG_300MB
5887 !Fname = trim(input_dir)//'/cksg_500mb_As'
5888 !OPEN(UNIT=hujisbm_unit1,FILE=Fname,FORM="FORMATTED",STATUS="OLD",ERR=2070)
5889 !READ(hujisbm_unit1,900) YWSG_500MB
5890 !Fname = trim(input_dir)//'/cksg_750mb_As'
5891 !OPEN(UNIT=hujisbm_unit1,FILE=Fname,FORM="FORMATTED",STATUS="OLD",ERR=2070)
5892 !READ(hujisbm_unit1,900) YWSG_750MB
5894 Fname = trim(input_dir)//'/cksg_33_300mb_500mb_750mb.asc'
5895 OPEN(UNIT=hujisbm_unit1,FILE=Fname,FORM="FORMATTED",STATUS="OLD",ERR=2070)
5896 READ(hujisbm_unit1,900) YWSG_300MB,YWSG_500MB,YWSG_750MB
5897 CLOSE(hujisbm_unit1)
5900 !Fname = trim(input_dir)//'/ckss_300mb_As'
5901 !OPEN(UNIT=hujisbm_unit1,FILE=Fname,FORM="FORMATTED",STATUS="OLD",ERR=2070)
5902 !READ(hujisbm_unit1,900) YWSS_300MB
5903 !Fname = trim(input_dir)//'/ckss_500mb_As'
5904 !OPEN(UNIT=hujisbm_unit1,FILE=Fname,FORM="FORMATTED",STATUS="OLD",ERR=2070)
5905 !READ(hujisbm_unit1,900) YWSS_500MB
5906 !Fname = trim(input_dir)//'/ckss_750mb_As'
5907 !OPEN(UNIT=hujisbm_unit1,FILE=Fname,FORM="FORMATTED",STATUS="OLD",ERR=2070)
5908 !READ(hujisbm_unit1,900) YWSS_750MB
5910 Fname = trim(input_dir)//'/ckss_33_300mb_500mb_750mb.asc'
5911 OPEN(UNIT=hujisbm_unit1,FILE=Fname,FORM="FORMATTED",STATUS="OLD",ERR=2070)
5912 READ(hujisbm_unit1,900) YWSS_300MB,YWSS_500MB,YWSS_750MB
5913 CLOSE(hujisbm_unit1)
5916 #if (defined(DM_PARALLEL))
5917 DM_BCAST_MACRO_R4(YWLI_300MB)
5918 DM_BCAST_MACRO_R4(YWLI_500MB)
5919 DM_BCAST_MACRO_R4(YWLI_750MB)
5921 DM_BCAST_MACRO_R4(YWLG_300MB)
5922 DM_BCAST_MACRO_R4(YWLG_500MB)
5923 DM_BCAST_MACRO_R4(YWLG_750MB)
5924 !DM_BCAST_MACRO(YWLG)
5926 DM_BCAST_MACRO_R4(YWLH_300MB)
5927 DM_BCAST_MACRO_R4(YWLH_500MB)
5928 DM_BCAST_MACRO_R4(YWLH_750MB)
5930 DM_BCAST_MACRO_R4(YWLS_300MB)
5931 DM_BCAST_MACRO_R4(YWLS_500MB)
5932 DM_BCAST_MACRO_R4(YWLS_750MB)
5934 DM_BCAST_MACRO_R4(YWII_300MB)
5935 DM_BCAST_MACRO_R4(YWII_500MB)
5936 DM_BCAST_MACRO_R4(YWII_750MB)
5938 DM_BCAST_MACRO_R4(YWIS_300MB)
5939 DM_BCAST_MACRO_R4(YWIS_500MB)
5940 DM_BCAST_MACRO_R4(YWIS_750MB)
5942 DM_BCAST_MACRO_R4(YWSG_300MB)
5943 DM_BCAST_MACRO_R4(YWSG_500MB)
5944 DM_BCAST_MACRO_R4(YWSG_750MB)
5946 DM_BCAST_MACRO_R4(YWSS_300MB)
5947 DM_BCAST_MACRO_R4(YWSS_500MB)
5948 DM_BCAST_MACRO_R4(YWSS_750MB)
5951 WRITE(errmess, '(A,I2)') 'FAST_SBM_INIT : succesfull reading Table-7'
5952 CALL wrf_debug(000, errmess)
5953 ! +-----------------------------------------------------------------------+
5957 ! +--------------------------------------------------------------+
5958 if (.NOT. ALLOCATED(RO1BL)) ALLOCATE(RO1BL(nkr))
5959 if (.NOT. ALLOCATED(RO2BL)) ALLOCATE(RO2BL(nkr,icemax))
5960 if (.NOT. ALLOCATED(RO3BL)) ALLOCATE(RO3BL(nkr))
5961 if (.NOT. ALLOCATED(RO4BL)) ALLOCATE(RO4BL(nkr))
5962 if (.NOT. ALLOCATED(RO5BL)) ALLOCATE(RO5BL(nkr))
5965 IF ( wrf_dm_on_monitor() ) THEN
5967 INQUIRE ( i , OPENED = opened )
5968 IF ( .NOT. opened ) THEN
5976 #if (defined(DM_PARALLEL))
5977 CALL wrf_dm_bcast_bytes ( hujisbm_unit1 , IWORDSIZE )
5979 IF ( hujisbm_unit1 < 0 ) THEN
5980 CALL wrf_error_fatal ( 'module_mp_FAST_SBM: Table-8 -- FAST_SBM_INIT: '// &
5981 'Can not find unused fortran unit to read in lookup table,model stop' )
5983 IF ( wrf_dm_on_monitor() ) THEN
5984 WRITE(errmess, '(A,I2)') 'module_mp_WRFsbm : Table-8 -- opening bulkdens.asc on unit ',hujisbm_unit1
5985 CALL wrf_debug(150, errmess)
5986 OPEN(UNIT=hujisbm_unit1,FILE=trim(input_dir)//"/bulkdens33.asc",FORM="FORMATTED",STATUS="OLD",ERR=2070)
5987 !OPEN(UNIT=hujisbm_unit1,FILE=trim(input_dir)//"/bulkdens43.asc",FORM="FORMATTED",STATUS="OLD",ERR=2070)
5988 READ(hujisbm_unit1,900) RO1BL,RO2BL,RO3BL,RO4BL,RO5BL
5989 CLOSE(hujisbm_unit1)
5992 #if (defined(DM_PARALLEL))
5993 DM_BCAST_MACRO_R4(RO1BL)
5994 DM_BCAST_MACRO_R4(RO2BL)
5995 DM_BCAST_MACRO_R4(RO3BL)
5996 DM_BCAST_MACRO_R4(RO4BL)
5997 DM_BCAST_MACRO_R4(RO5BL)
5999 WRITE(errmess, '(A,I2)') 'FAST_SBM_INIT : succesfull reading Table-8'
6000 CALL wrf_debug(000, errmess)
6001 ! +----------------------------------------------------------------------+
6005 ! +-----------------------------------------------------------+
6006 if (.NOT. ALLOCATED(RADXXO)) ALLOCATE(RADXXO(nkr,nhydro))
6008 IF ( wrf_dm_on_monitor() ) THEN
6010 INQUIRE ( i , OPENED = opened )
6011 IF ( .NOT. opened ) THEN
6018 #if (defined(DM_PARALLEL))
6019 CALL wrf_dm_bcast_bytes ( hujisbm_unit1 , IWORDSIZE )
6021 IF ( hujisbm_unit1 < 0 ) THEN
6022 CALL wrf_error_fatal ( 'module_mp_FAST_SBM: Table-9 -- FAST_SBM_INIT: '// &
6023 'Can not find unused fortran unit to read in lookup table,model stop' )
6025 IF ( wrf_dm_on_monitor() ) THEN
6026 WRITE(errmess, '(A,I2)') 'module_mp_FAST_SBM : Table-9 -- opening bulkradii.asc on unit',hujisbm_unit1
6027 CALL wrf_debug(150, errmess)
6028 OPEN(UNIT=hujisbm_unit1,FILE=trim(input_dir)//"/bulkradii33.asc",FORM="FORMATTED",STATUS="OLD",ERR=2070)
6029 !OPEN(UNIT=hujisbm_unit1,FILE=trim(input_dir)//"/bulkradii43.asc",FORM="FORMATTED",STATUS="OLD",ERR=2070)
6030 READ(hujisbm_unit1,*) RADXXO
6031 CLOSE(hujisbm_unit1)
6034 #if (defined(DM_PARALLEL))
6035 DM_BCAST_MACRO_R4(RADXXO)
6037 WRITE(errmess, '(A,I2)') 'FAST_SBM_INIT : succesfull reading Table-9'
6038 CALL wrf_debug(000, errmess)
6039 ! +-----------------------------------------------------------------------+
6042 ! Polar-HUCM Scattering Amplitudes Look-up table :
6043 ! +-----------------------------------------------------------------------+
6044 CALL LOAD_TABLES(NKR) ! (KS) - Loading the scattering look-up-table
6046 ! ... (KS) - Broadcating Liquid drops
6047 #if (defined(DM_PARALLEL))
6048 DM_BCAST_MACRO_R16(FAF1)
6049 DM_BCAST_MACRO_R16(FBF1)
6050 DM_BCAST_MACRO_R16(FAB1)
6051 DM_BCAST_MACRO_R16(FBB1)
6052 ! ... (KS) - Broadcating Snow
6053 DM_BCAST_MACRO_R16(FAF3)
6054 DM_BCAST_MACRO_R16(FBF3)
6055 DM_BCAST_MACRO_R16(FAB3)
6056 DM_BCAST_MACRO_R16(FBB3)
6057 ! ... (KS) - Broadcating Graupel
6058 DM_BCAST_MACRO_R16(FAF4)
6059 DM_BCAST_MACRO_R16(FBF4)
6060 DM_BCAST_MACRO_R16(FAB4)
6061 DM_BCAST_MACRO_R16(FBB4)
6062 ! ### (KS) - Broadcating Hail
6063 DM_BCAST_MACRO_R16(FAF5)
6064 DM_BCAST_MACRO_R16(FBF5)
6065 DM_BCAST_MACRO_R16(FAB5)
6066 DM_BCAST_MACRO_R16(FBB5)
6067 ! ### (KS) - Broadcating Usetables array
6068 CALL wrf_dm_bcast_integer ( usetables , size ( usetables ) * IWORDSIZE )
6070 WRITE(errmess, '(A,I2)') 'module_mp_WRFsbm : succesfull reading Table-10'
6071 call wrf_message(errmess)
6072 ! +-----------------------------------------------------------------------+
6074 ! calculation of the mass(in mg) for categories boundaries :
6078 xl_mg(i) = xl(i)*1.e3
6079 xs_mg(i) = xs(i)*1.e3
6080 xg_mg(i) = xg(i)*1.e3
6081 xh_mg(i) = xh(i)*1.e3
6082 xi1_mg(i) = xi(i,1)*1.e3
6083 xi2_mg(i) = xi(i,2)*1.e3
6084 xi3_mg(i) = xi(i,3)*1.e3
6087 if (.NOT. ALLOCATED(IMA)) ALLOCATE(IMA(nkr,nkr))
6088 if (.NOT. ALLOCATED(CHUCM)) ALLOCATE(CHUCM(nkr,nkr))
6091 CALL courant_bott_KS(xl, nkr, chucm, ima, scal) ! ### (KS) : New courant_bott_KS (without XL_MG(0:nkr))
6092 WRITE(errmess, '(A,I2)') 'FAST_SBM_INIT : succesfull reading "courant_bott_KS" '
6093 CALL wrf_debug(000, errmess)
6098 if (.NOT. ALLOCATED(DROPRADII)) ALLOCATE(DROPRADII(NKR))
6100 DROPRADII(KR)=(3.0*XL(KR)/4.0/3.141593/1.0)**DEG01
6103 ! +-------------------------------------------------------------+
6104 ! Allocating Aerosols Array
6105 ! +-------------------------+
6106 if (.NOT. ALLOCATED(FCCNR_MAR)) ALLOCATE(FCCNR_MAR(NKR_aerosol))
6107 if (.NOT. ALLOCATED(FCCNR_CON)) ALLOCATE(FCCNR_CON(NKR_aerosol))
6108 if (.NOT. ALLOCATED(XCCN)) ALLOCATE(XCCN(NKR_aerosol))
6109 if (.NOT. ALLOCATED(RCCN)) ALLOCATE(RCCN(NKR_aerosol))
6110 if (.NOT. ALLOCATED(Scale_CCN_Factor)) ALLOCATE(Scale_CCN_Factor)
6111 if (.NOT. ALLOCATED(FCCN)) ALLOCATE(FCCN(NKR_aerosol))
6113 IF(ILogNormal_modes_Aerosol == 1)THEN
6114 ! ... Initializing the FCCNR_MAR and FCCNR_CON
6117 Scale_CCN_Factor = 1.0
6120 CALL LogNormal_modes_Aerosol(FCCNR_CON,FCCNR_MAR,NKR_aerosol,COL,XL,XCCN,RCCN,RO_SOLUTE,Scale_CCN_Factor,1)
6121 CALL LogNormal_modes_Aerosol(FCCNR_CON,FCCNR_MAR,NKR_aerosol,COL,XL,XCCN,RCCN,RO_SOLUTE,Scale_CCN_Factor,2)
6122 WRITE(errmess, '(A,I2)') 'module_mp_WRFsbm : succesfull reading "LogNormal_modes_Aerosol" '
6123 CALL wrf_debug(000, errmess)
6125 ! +-------------------------------------------------------------+
6127 if (.NOT. ALLOCATED(PKIJ)) ALLOCATE(PKIJ(JBREAK,JBREAK,JBREAK))
6128 if (.NOT. ALLOCATED(QKJ)) ALLOCATE(QKJ(JBREAK,JBREAK))
6129 if (.NOT. ALLOCATED(ECOALMASSM)) ALLOCATE(ECOALMASSM(NKR,NKR))
6130 if (.NOT. ALLOCATED(BRKWEIGHT)) ALLOCATE(BRKWEIGHT(JBREAK))
6135 CALL BREAKINIT_KS(PKIJ,QKJ,ECOALMASSM,BRKWEIGHT,XL,DROPRADII,BR_MAX,JBREAK,JMAX,NKR,VR1) ! Rain Spontanous Breakup
6136 #if (defined(DM_PARALLEL))
6137 DM_BCAST_MACRO_R4(PKIJ)
6138 DM_BCAST_MACRO_R4(QKJ)
6140 WRITE(errmess, '(A,I2)') 'FAST_SBM_INIT : succesfull reading BREAKINIT_KS" '
6141 CALL wrf_debug(000, errmess)
6142 ! +--------------------------------------------------------------------------------------------------------------------+
6145 101 FORMAT(3X,F7.5,E13.5)
6149 123 FORMAT(3E12.4,3I4)
6153 301 FORMAT(3X,F8.3,3X,E13.5)
6156 if (.NOT. ALLOCATED(cwll)) ALLOCATE(cwll(nkr,nkr))
6158 if (.NOT. ALLOCATED(cwli_1)) ALLOCATE(cwli_1(nkr,nkr))
6159 if (.NOT. ALLOCATED(cwli_2)) ALLOCATE(cwli_2(nkr,nkr))
6160 if (.NOT. ALLOCATED(cwli_3)) ALLOCATE(cwli_3(nkr,nkr))
6162 if (.NOT. ALLOCATED(cwil_1)) ALLOCATE(cwil_1(nkr,nkr))
6163 if (.NOT. ALLOCATED(cwil_2)) ALLOCATE(cwil_2(nkr,nkr))
6164 if (.NOT. ALLOCATED(cwil_3)) ALLOCATE(cwil_3(nkr,nkr))
6166 if (.NOT. ALLOCATED(cwlg)) ALLOCATE(cwlg(nkr,nkr))
6167 if (.NOT. ALLOCATED(cwlh)) ALLOCATE(cwlh(nkr,nkr))
6168 if (.NOT. ALLOCATED(cwls)) ALLOCATE(cwls(nkr,nkr))
6169 if (.NOT. ALLOCATED(cwgl)) ALLOCATE(cwgl(nkr,nkr))
6170 if (.NOT. ALLOCATED(cwhl)) ALLOCATE(cwhl(nkr,nkr))
6171 if (.NOT. ALLOCATED(cwsl)) ALLOCATE(cwsl(nkr,nkr))
6173 if (.NOT. ALLOCATED(cwii_1_1)) ALLOCATE(cwii_1_1(nkr,nkr))
6174 if (.NOT. ALLOCATED(cwii_1_2)) ALLOCATE(cwii_1_2(nkr,nkr))
6175 if (.NOT. ALLOCATED(cwii_1_3)) ALLOCATE(cwii_1_3(nkr,nkr))
6176 if (.NOT. ALLOCATED(cwii_2_1)) ALLOCATE(cwii_2_1(nkr,nkr))
6177 if (.NOT. ALLOCATED(cwii_2_2)) ALLOCATE(cwii_2_2(nkr,nkr))
6178 if (.NOT. ALLOCATED(cwii_2_3)) ALLOCATE(cwii_2_3(nkr,nkr))
6179 if (.NOT. ALLOCATED(cwii_3_1)) ALLOCATE(cwii_3_1(nkr,nkr))
6180 if (.NOT. ALLOCATED(cwii_3_2)) ALLOCATE(cwii_3_2(nkr,nkr))
6181 if (.NOT. ALLOCATED(cwii_3_3)) ALLOCATE(cwii_3_3(nkr,nkr))
6183 if (.NOT. ALLOCATED(cwis_1)) ALLOCATE(cwis_1(nkr,nkr))
6184 if (.NOT. ALLOCATED(cwis_2)) ALLOCATE(cwis_2(nkr,nkr))
6185 if (.NOT. ALLOCATED(cwis_3)) ALLOCATE(cwis_3(nkr,nkr))
6186 if (.NOT. ALLOCATED(cwsi_1)) ALLOCATE(cwsi_1(nkr,nkr))
6187 if (.NOT. ALLOCATED(cwsi_2)) ALLOCATE(cwsi_2(nkr,nkr))
6188 if (.NOT. ALLOCATED(cwsi_3)) ALLOCATE(cwsi_3(nkr,nkr))
6190 if (.NOT. ALLOCATED(cwig_1)) ALLOCATE(cwig_1(nkr,nkr))
6191 if (.NOT. ALLOCATED(cwig_2)) ALLOCATE(cwig_2(nkr,nkr))
6192 if (.NOT. ALLOCATED(cwig_3)) ALLOCATE(cwig_3(nkr,nkr))
6194 if (.NOT. ALLOCATED(cwih_1)) ALLOCATE(cwih_1(nkr,nkr))
6195 if (.NOT. ALLOCATED(cwih_2)) ALLOCATE(cwih_2(nkr,nkr))
6196 if (.NOT. ALLOCATED(cwih_3)) ALLOCATE(cwih_3(nkr,nkr))
6198 if (.NOT. ALLOCATED(cwsg)) ALLOCATE(cwsg(nkr,nkr))
6199 if (.NOT. ALLOCATED(cwss)) ALLOCATE(cwss(nkr,nkr))
6202 cwli_1(:,:) = 0.0e0 ; cwli_2(:,:) = 0.0e0 ; cwli_3(:,:) = 0.0e0
6203 cwil_1(:,:) = 0.0e0 ; cwil_2(:,:) = 0.0e0 ; cwil_3(:,:) = 0.0e0
6204 cwlg(:,:) = 0.0e0 ; cwlh(:,:) = 0.0e0 ; cwls(:,:) = 0.0e0
6205 cwgl(:,:) = 0.0e0 ; cwhl(:,:) = 0.0e0 ; cwsl(:,:) = 0.0e0
6206 cwii_1_1(:,:) = 0.0e0 ; cwii_1_2(:,:) = 0.0e0 ; cwii_1_3(:,:) = 0.0e0
6207 cwii_2_1(:,:) = 0.0e0 ; cwii_2_2(:,:) = 0.0e0 ; cwii_2_3(:,:) = 0.0e0
6208 cwii_3_1(:,:) = 0.0e0 ; cwii_3_2(:,:) = 0.0e0 ; cwii_3_3(:,:) = 0.0e0
6209 cwis_1(:,:) = 0.0e0 ; cwis_2(:,:) = 0.0e0 ; cwis_3(:,:) = 0.0e0
6210 cwsi_1(:,:) = 0.0e0 ; cwsi_2(:,:) = 0.0e0 ; cwsi_3(:,:) = 0.0e0
6211 cwig_1(:,:) = 0.0e0 ; cwig_2(:,:) = 0.0e0 ; cwig_3(:,:) = 0.0e0
6212 cwih_1(:,:) = 0.0e0 ; cwih_2(:,:) = 0.0e0 ; cwih_3(:,:) = 0.0e0
6213 cwsg(:,:) = 0.0e0 ; cwss(:,:) = 0.0e0
6215 call Kernals_KS(dt,nkr,7.6E6)
6217 !+---+-----------------------------------------+
6218 if (.NOT. ALLOCATED( Prob)) ALLOCATE( Prob(NKR))
6219 if (.NOT. ALLOCATED(Gain_Var_New)) ALLOCATE(Gain_Var_New(NKR,NKR))
6220 if (.NOT. ALLOCATED(NND)) ALLOCATE(NND(NKR,NKR))
6224 call Spontanous_Init(dt, XL, DROPRADII, Prob, Gain_Var_New, NND, NKR, ikr_spon_break)
6225 WRITE(errmess, '(A,I2)') 'FAST_SBM_INIT : succesfull reading "Spontanous_Init" '
6226 CALL wrf_debug(000, errmess)
6231 WRITE( errmess , '(A,I4)' ) &
6232 'module_mp_FAST_SBM_INIT: error opening hujisbm_DATA on unit,model stop ' &
6234 CALL wrf_error_fatal(errmess)
6236 END SUBROUTINE FAST_HUCMINIT
6237 ! -----------------------------------------------------------------+
6238 subroutine Kernals_KS(dtime_coal,nkr,p_z)
6243 real(kind=r4size),intent(in) :: dtime_coal,p_z
6247 real(kind=r4size),parameter :: p1=1.0e6,p2=0.75e6,p3=0.50e6,p4=0.3e6
6248 real(kind=r4size) :: dlnr, scal, dtimelnr, pdm, p_1, p_2, p_3, ckern_1, ckern_2, &
6251 ! p1=1.00D6 dynes/cm^2 = 1000.0 mb
6252 ! p2=0.75D6 dynes/cm^2 = 750.0 mb
6253 ! p3=0.50D6 dynes/cm^2 = 500.0 mb
6254 ! p4=0.30D6 dynes/cm^2 = 300.0 mb
6257 dlnr = dlog(2.0d0)/(3.0d0*scal)
6258 dtimelnr = dtime_coal*dlnr
6266 ckern_1 = YWLL_1000mb(i,j)
6267 ckern_2 = YWLL_750mb(i,j)
6268 ckern_3 = YWLL_500mb(i,j)
6269 cwll(i,j) = ckern_z(p_z,p_1,p_2,p_3,ckern_1,ckern_2,ckern_3)*dtime_coal*dlnr
6273 ! ... ECOALMASSM is from "BreakIniit_KS"
6276 CWLL(I,J) = ECOALMASSM(I,J)*CWLL(I,J)
6287 cwli_1(i,j) = ywli_750mb(i,j,1)*dtimelnr
6288 cwli_2(i,j) = ywli_750mb(i,j,2)*dtimelnr
6289 cwli_3(i,j) = ywli_750mb(i,j,3)*dtimelnr
6290 cwlg(i,j) = ywlg_750mb(i,j)*dtimelnr
6291 cwlh(i,j) = ywlh_750mb(i,j)*dtimelnr
6292 cwls(i,j) = ywls_750mb(i,j)*dtimelnr
6293 cwii_1_1(i,j) = ywii_750mb(i,j,1,1)*dtimelnr
6294 cwii_1_2(i,j) = ywii_750mb(i,j,1,2)*dtimelnr
6295 cwii_1_3(i,j) = ywii_750mb(i,j,1,3)*dtimelnr
6296 cwii_2_1(i,j) = ywii_750mb(i,j,2,1)*dtimelnr
6297 cwii_2_2(i,j) = ywii_750mb(i,j,2,2)*dtimelnr
6298 cwii_2_3(i,j) = ywii_750mb(i,j,2,3)*dtimelnr
6299 cwii_3_1(i,j) = ywii_750mb(i,j,3,1)*dtimelnr
6300 cwii_3_2(i,j) = ywii_750mb(i,j,3,2)*dtimelnr
6301 cwii_3_3(i,j) = ywii_750mb(i,j,3,3)*dtimelnr
6302 cwis_1(i,j) = ywis_750mb(i,j,1)*dtimelnr
6303 cwis_2(i,j) = ywis_750mb(i,j,2)*dtimelnr
6304 cwis_3(i,j) = ywis_750mb(i,j,3)*dtimelnr
6305 cwsg(i,j) = ywsg_750mb(i,j)*dtimelnr
6306 cwss(i,j) = ywss_750mb(i,j)*dtimelnr
6311 if (p_z <= p_3) then
6314 cwli_1(i,j) = ywli_300mb(i,j,1)*dtimelnr
6315 cwli_2(i,j) = ywli_300mb(i,j,2)*dtimelnr
6316 cwli_3(i,j) = ywli_300mb(i,j,3)*dtimelnr
6317 cwlg(i,j) = ywlg_300mb(i,j)*dtimelnr
6318 cwlh(i,j) = ywlh_300mb(i,j)*dtimelnr
6319 cwls(i,j) = ywls_300mb(i,j)*dtimelnr
6320 cwii_1_1(i,j) = ywii_300mb(i,j,1,1)*dtimelnr
6321 cwii_1_2(i,j) = ywii_300mb(i,j,1,2)*dtimelnr
6322 cwii_1_3(i,j) = ywii_300mb(i,j,1,3)*dtimelnr
6323 cwii_2_1(i,j) = ywii_300mb(i,j,2,1)*dtimelnr
6324 cwii_2_2(i,j) = ywii_300mb(i,j,2,2)*dtimelnr
6325 cwii_2_3(i,j) = ywii_300mb(i,j,2,3)*dtimelnr
6326 cwii_3_1(i,j) = ywii_300mb(i,j,3,1)*dtimelnr
6327 cwii_3_2(i,j) = ywii_300mb(i,j,3,2)*dtimelnr
6328 cwii_3_3(i,j) = ywii_300mb(i,j,3,3)*dtimelnr
6329 cwis_1(i,j) = ywis_300mb(i,j,1)*dtimelnr
6330 cwis_2(i,j) = ywis_300mb(i,j,2)*dtimelnr
6331 cwis_3(i,j) = ywis_300mb(i,j,3)*dtimelnr
6332 cwsg(i,j) = ywsg_300mb(i,j)*dtimelnr
6333 cwss(i,j) = ywss_300mb(i,j)*dtimelnr
6338 if (p_z < p_1 .and. p_z >= p_2) then
6339 pdm = (p_z-p_2)/(p_1-p_2)
6342 ckern_1=ywli_750mb(i,j,1)
6343 ckern_2=ywli_500mb(i,j,1)
6344 cwli_1(i,j)=(ckern_2+(ckern_1-ckern_2)*pdm)*dtimelnr
6346 ckern_1=ywli_750mb(i,j,2)
6347 ckern_2=ywli_500mb(i,j,2)
6348 cwli_2(i,j)=(ckern_2+(ckern_1-ckern_2)*pdm)*dtimelnr
6350 ckern_1=ywli_750mb(i,j,3)
6351 ckern_2=ywli_500mb(i,j,3)
6352 cwli_3(i,j)=(ckern_2+(ckern_1-ckern_2)*pdm)*dtimelnr
6354 ckern_1=ywlg_750mb(i,j)
6355 ckern_2=ywlg_500mb(i,j)
6356 cwlg(i,j)=(ckern_2+(ckern_1-ckern_2)*pdm)*dtimelnr
6358 ckern_1=ywlh_750mb(i,j)
6359 ckern_2=ywlh_500mb(i,j)
6360 cwlh(i,j)=(ckern_2+(ckern_1-ckern_2)*pdm)*dtimelnr
6362 ckern_1=ywls_750mb(i,j)
6363 ckern_2=ywls_500mb(i,j)
6364 cwls(i,j)=(ckern_2+(ckern_1-ckern_2)*pdm)*dtimelnr
6366 ckern_1=ywii_750mb(i,j,1,1)
6367 ckern_2=ywii_500mb(i,j,1,1)
6368 cwii_1_1(i,j)=(ckern_2+(ckern_1-ckern_2)*pdm)*dtimelnr
6370 ckern_1=ywii_750mb(i,j,1,2)
6371 ckern_2=ywii_500mb(i,j,1,2)
6372 cwii_1_2(i,j)=(ckern_2+(ckern_1-ckern_2)*pdm)*dtimelnr
6374 ckern_1=ywii_750mb(i,j,1,3)
6375 ckern_2=ywii_500mb(i,j,1,3)
6376 cwii_1_3(i,j)=(ckern_2+(ckern_1-ckern_2)*pdm)*dtimelnr
6378 ckern_1=ywii_750mb(i,j,2,1)
6379 ckern_2=ywii_500mb(i,j,2,1)
6380 cwii_2_1(i,j)=(ckern_2+(ckern_1-ckern_2)*pdm)*dtimelnr
6383 ckern_1=ywii_750mb(i,j,2,2)
6384 ckern_2=ywii_500mb(i,j,2,2)
6385 cwii_2_2(i,j)=(ckern_2+(ckern_1-ckern_2)*pdm)*dtimelnr
6387 ckern_1=ywii_750mb(i,j,2,3)
6388 ckern_2=ywii_500mb(i,j,2,3)
6389 cwii_2_3(i,j)=(ckern_2+(ckern_1-ckern_2)*pdm)*dtimelnr
6391 ckern_1=ywii_750mb(i,j,3,1)
6392 ckern_2=ywii_500mb(i,j,3,1)
6393 cwii_3_1(i,j)=(ckern_2+(ckern_1-ckern_2)*pdm)*dtimelnr
6395 ckern_1=ywii_750mb(i,j,3,2)
6396 ckern_2=ywii_500mb(i,j,3,2)
6397 cwii_3_2(i,j)=(ckern_2+(ckern_1-ckern_2)*pdm)*dtimelnr
6399 ckern_1=ywii_750mb(i,j,3,3)
6400 ckern_2=ywii_500mb(i,j,3,3)
6401 cwii_3_3(i,j)=(ckern_2+(ckern_1-ckern_2)*pdm)*dtimelnr
6403 ckern_1=ywis_750mb(i,j,1)
6404 ckern_2=ywis_500mb(i,j,1)
6405 cwis_1(i,j)=(ckern_2+(ckern_1-ckern_2)*pdm)*dtimelnr
6407 ckern_1=ywis_750mb(i,j,2)
6408 ckern_2=ywis_500mb(i,j,2)
6409 cwis_2(i,j)=(ckern_2+(ckern_1-ckern_2)*pdm)*dtimelnr
6411 ckern_1=ywis_750mb(i,j,3)
6412 ckern_2=ywis_500mb(i,j,3)
6413 cwis_3(i,j)=(ckern_2+(ckern_1-ckern_2)*pdm)*dtimelnr
6415 ckern_1=ywsg_750mb(i,j)
6416 ckern_2=ywsg_500mb(i,j)
6417 cwsg(i,j)=(ckern_2+(ckern_1-ckern_2)*pdm)*dtimelnr
6419 ckern_1=ywss_750mb(i,j)
6420 ckern_2=ywss_500mb(i,j)
6421 cwss(i,j)=(ckern_2+(ckern_1-ckern_2)*pdm)*dtimelnr
6426 if (p_z < p_2 .and. p_z > p_3) then
6427 pdm = (p_z-p_3)/(p_2-p_3)
6431 ckern_2=ywli_500mb(i,j,1)
6432 ckern_3=ywli_300mb(i,j,1)
6433 cwli_1(i,j)=(ckern_3+(ckern_2-ckern_3)*pdm)*dtimelnr
6435 ckern_2=ywli_500mb(i,j,2)
6436 ckern_3=ywli_300mb(i,j,2)
6437 cwli_2(i,j)=(ckern_3+(ckern_2-ckern_3)*pdm)*dtimelnr
6439 ckern_2=ywli_500mb(i,j,3)
6440 ckern_3=ywli_300mb(i,j,3)
6441 cwli_3(i,j)=(ckern_3+(ckern_2-ckern_3)*pdm)*dtimelnr
6443 ckern_2=ywlg_500mb(i,j)
6444 ckern_3=ywlg_300mb(i,j)
6445 cwlg(i,j)=(ckern_3+(ckern_2-ckern_3)*pdm)*dtimelnr
6447 ckern_2=ywlh_500mb(i,j)
6448 ckern_3=ywlh_300mb(i,j)
6449 cwlh(i,j)=(ckern_3+(ckern_2-ckern_3)*pdm)*dtimelnr
6451 ckern_2=ywls_500mb(i,j)
6452 ckern_3=ywls_300mb(i,j)
6453 cwls(i,j)=(ckern_3+(ckern_2-ckern_3)*pdm)*dtimelnr
6455 ckern_2=ywii_500mb(i,j,1,1)
6456 ckern_3=ywii_300mb(i,j,1,1)
6457 cwii_1_1(i,j)=(ckern_3+(ckern_2-ckern_3)*pdm)*dtimelnr
6459 ckern_2=ywii_500mb(i,j,1,2)
6460 ckern_3=ywii_300mb(i,j,1,2)
6461 cwii_1_2(i,j)=(ckern_3+(ckern_2-ckern_3)*pdm)*dtimelnr
6463 ckern_2=ywii_500mb(i,j,1,3)
6464 ckern_3=ywii_300mb(i,j,1,3)
6465 cwii_1_3(i,j)=(ckern_3+(ckern_2-ckern_3)*pdm)*dtimelnr
6467 ckern_2=ywii_500mb(i,j,2,1)
6468 ckern_3=ywii_300mb(i,j,2,1)
6469 cwii_2_1(i,j)=(ckern_3+(ckern_2-ckern_3)*pdm)*dtimelnr
6471 ckern_2=ywii_500mb(i,j,2,2)
6472 ckern_3=ywii_300mb(i,j,2,2)
6473 cwii_2_2(i,j)=(ckern_3+(ckern_2-ckern_3)*pdm)*dtimelnr
6475 ckern_2=ywii_500mb(i,j,2,3)
6476 ckern_3=ywii_300mb(i,j,2,3)
6477 cwii_2_3(i,j)=(ckern_3+(ckern_2-ckern_3)*pdm)*dtimelnr
6479 ckern_2=ywii_500mb(i,j,3,1)
6480 ckern_3=ywii_300mb(i,j,3,1)
6481 cwii_3_1(i,j)=(ckern_3+(ckern_2-ckern_3)*pdm)*dtimelnr
6483 ckern_2=ywii_500mb(i,j,3,2)
6484 ckern_3=ywii_300mb(i,j,3,2)
6485 cwii_3_2(i,j)=(ckern_3+(ckern_2-ckern_3)*pdm)*dtimelnr
6487 ckern_2=ywii_500mb(i,j,3,3)
6488 ckern_3=ywii_300mb(i,j,3,3)
6489 cwii_3_3(i,j)=(ckern_3+(ckern_2-ckern_3)*pdm)*dtimelnr
6491 ckern_2=ywis_500mb(i,j,1)
6492 ckern_3=ywis_300mb(i,j,1)
6493 cwis_1(i,j)=(ckern_3+(ckern_2-ckern_3)*pdm)*dtimelnr
6495 ckern_2=ywis_500mb(i,j,2)
6496 ckern_3=ywis_300mb(i,j,2)
6497 cwis_2(i,j)=(ckern_3+(ckern_2-ckern_3)*pdm)*dtimelnr
6499 ckern_2=ywis_500mb(i,j,3)
6500 ckern_3=ywis_300mb(i,j,3)
6501 cwis_3(i,j)=(ckern_3+(ckern_2-ckern_3)*pdm)*dtimelnr
6503 ckern_2=ywsg_500mb(i,j)
6504 ckern_3=ywsg_300mb(i,j)
6505 cwsg(i,j)=(ckern_3+(ckern_2-ckern_3)*pdm)*dtimelnr
6507 ckern_2=ywss_500mb(i,j)
6508 ckern_3=ywss_300mb(i,j)
6509 cwss(i,j)=(ckern_3+(ckern_2-ckern_3)*pdm)*dtimelnr
6518 cwil_1(i,j)=cwli_1(j,i)
6520 cwil_2(i,j)=cwli_2(j,i)
6522 cwil_3(i,j)=cwli_3(j,i)
6523 ! 3. graupel - water
6529 ! 7.snow - crystals :
6531 cwsi_1(i,j)=cwis_1(j,i)
6533 cwsi_2(i,j)=cwis_2(j,i)
6535 cwsi_3(i,j)=cwis_3(j,i)
6541 end subroutine Kernals_KS
6543 ! ------------------------------------------------------------+
6544 real function ckern_z (p_z,p_1,p_2,p_3,ckern_1,ckern_2,ckern_3)
6548 real(kind=r4size),intent(in) :: p_z,p_1,p_2,p_3,ckern_1, &
6551 if(p_z>=p_1) ckern_z = ckern_1
6552 !if(p_z==p_2) ckern_z=ckern_2
6553 if(p_z<=p_3) ckern_z = ckern_3
6554 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)
6555 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)
6558 end function ckern_z
6559 ! -------------------------------------------------------------+
6560 SUBROUTINE FREEZ(FF1,XL,FF2,XI,FF3,XS,FF4,XG,FF5,XH, &
6561 TIN,DT,RO,COL,AFREEZMY,BFREEZMY, &
6562 BFREEZMAX,KRFREEZ,ICEMAX,NKR)
6566 INTEGER KR,ICE,ICE_TYPE
6567 REAL COL,AFREEZMY,BFREEZMY,BFREEZMAX
6568 INTEGER KRFREEZ,ICEMAX,NKR
6569 REAL DT,RO,YKK,PF,PF_1,DEL_T,TT_DROP,ARG_1,YK2,DF1,BF,ARG_M, &
6570 TT_DROP_AFTER_FREEZ,CFREEZ,SUM_ICE,TIN,TTIN,AF,FF_MAX,F1_MAX, &
6571 F2_MAX,F3_MAX,F4_MAX,F5_MAX
6573 REAL FF1(NKR),XL(NKR),FF2(NKR,ICEMAX) &
6574 ,XI(NKR,ICEMAX),FF3(NKR),XS(NKR),FF4(NKR) &
6575 ,XG(NKR),FF5(NKR),XH(NKR)
6586 F1_MAX=AMAX1(F1_MAX,FF1(KR))
6587 F3_MAX=AMAX1(F3_MAX,FF3(KR))
6588 F4_MAX=AMAX1(F4_MAX,FF4(KR))
6589 F5_MAX=AMAX1(F5_MAX,FF5(KR))
6591 F2_MAX=AMAX1(F2_MAX,FF2(KR,ICE))
6593 FF_MAX=AMAX1(F2_MAX,F3_MAX,F4_MAX,F5_MAX)
6596 !******************************* FREEZING ****************************
6598 IF(DEL_T.LT.0.AND.F1_MAX.NE.0) THEN
6601 CFREEZ =(BFREEZMAX-BFREEZMY)/XL(NKR)
6603 !***************************** MASS LOOP **************************
6607 BF =BFREEZMY+CFREEZ*ARG_M
6608 PF_1 =AF*EXP(-BF*DEL_T)
6611 DF1 =FF1(KR)*(1.-YKK)
6614 IF(KR.LE.KRFREEZ) THEN
6615 FF2(KR,ICE_TYPE)=FF2(KR,ICE_TYPE)+YK2
6617 FF5(KR) =FF5(KR)+YK2
6619 SUM_ICE=SUM_ICE+YK2*3.*XL(KR)*XL(KR)*COL
6621 !************************ END OF "MASS LOOP" **************************
6625 !************************** NEW TEMPERATURE *************************
6627 ARG_1 =333.*SUM_ICE/RO
6628 TT_DROP_AFTER_FREEZ=TTIN+ARG_1
6629 TIN =TT_DROP_AFTER_FREEZ
6631 !************************** END OF "FREEZING" ****************************
6636 END SUBROUTINE FREEZ
6637 ! ----------------------------------------------------------------+
6638 SUBROUTINE J_W_MELT(FF1,XL,FF2,XI,FF3,XS,FF4,XG,FF5,XH &
6639 ,TIN,DT,RO,COL,ICEMAX,NKR)
6643 integer,intent(in) :: NKR,ICEMAX
6644 real(kind=R4size),intent(in) :: DT,COL,RO
6645 real(kind=R4size),intent(inout) :: FF1(:),XL(:),FF2(:,:),XI(:,:),FF3(:),XS(:),FF4(:),XG(:), &
6649 integer :: KR,ICE,ICE_TYPE
6650 real(kind=R4size) :: ARG_M,TT_DROP,ARG_1,TT_DROP_AFTER_FREEZ,DF1,DN,DN0, &
6651 A,B,DTFREEZ,SUM_ICE,FF_MAX,F1_MAX,F2_MAX,F3_MAX,F4_MAX,F5_MAX, &
6652 DEL_T,meltrate,gamma
6664 F1_MAX=AMAX1(F1_MAX,FF1(KR))
6665 F3_MAX=AMAX1(F3_MAX,FF3(KR))
6666 F4_MAX=AMAX1(F4_MAX,FF4(KR))
6667 F5_MAX=AMAX1(F5_MAX,FF5(KR))
6669 F2_MAX=AMAX1(F2_MAX,FF2(KR,ICE))
6671 FF_MAX=AMAX1(F2_MAX,F3_MAX,F4_MAX,F5_MAX)
6674 IF(DEL_T.GE.0.AND.FF_MAX.NE.0) THEN
6679 IF (KR .le. 10) THEN
6680 ARG_M = ARG_M+FF2(KR,ICE)
6682 ELSE IF (KR .gt. 10 .and. KR .lt. 18) THEN
6684 ARG_M=ARG_M+FF2(KR,ICE)*(meltrate*dt)
6685 FF2(KR,ICE)=FF2(KR,ICE)-FF2(KR,ICE)*(meltrate*dt)
6687 meltrate = 0.683/120.
6688 ARG_M=ARG_M+FF2(KR,ICE)*(meltrate*dt)
6689 FF2(KR,ICE)=FF2(KR,ICE)-FF2(KR,ICE)*(meltrate*dt)
6692 IF (ICE ==2 .or. ICE ==3) THEN
6693 IF (kr .le. 12) THEN
6694 ARG_M = ARG_M+FF2(KR,ICE)
6696 ELSE IF (kr .gt. 12 .and. kr .lt. 20) THEN
6698 ARG_M=ARG_M+FF2(KR,ICE)*(meltrate*dt)
6699 FF2(KR,ICE)=FF2(KR,ICE)-FF2(KR,ICE)*(meltrate*dt)
6701 meltrate = 0.683/120.
6702 ARG_M=ARG_M+FF2(KR,ICE)*(meltrate*dt)
6703 FF2(KR,ICE)=FF2(KR,ICE)-FF2(KR,ICE)*(meltrate*dt)
6708 IF (kr .le. 14) THEN
6709 ARG_M = ARG_M + FF3(KR)
6711 ELSE IF (kr .gt. 14 .and. kr .lt. 22) THEN
6713 ARG_M=ARG_M+FF3(KR)*(meltrate*dt)
6714 FF3(KR)=FF3(KR)-FF3(KR)*(meltrate*dt)
6716 meltrate = 0.683/120.
6717 ARG_M=ARG_M+FF3(KR)*(meltrate*dt)
6718 FF3(KR)=FF3(KR)-FF3(KR)*(meltrate*dt)
6721 IF (kr .le. 13) then
6722 ARG_M = ARG_M+FF4(KR)+FF5(KR)
6725 ELSE IF (kr .gt. 13 .and. kr .lt. 23) THEN
6727 ARG_M=ARG_M+(FF4(KR)+FF5(KR))*(meltrate*dt)
6728 FF4(KR)=FF4(KR)-FF4(KR)*(meltrate*dt)
6729 FF5(KR)=FF5(KR)-FF5(KR)*(meltrate*dt)
6731 meltrate = 0.683/120.
6732 ARG_M=ARG_M+(FF4(KR)+FF5(KR))*(meltrate*dt)
6733 FF4(KR)=FF4(KR)-FF4(KR)*(meltrate*dt)
6734 FF5(KR)=FF5(KR)-FF5(KR)*(meltrate*dt)
6737 FF1(KR) = FF1(KR) + ARG_M
6738 SUM_ICE=SUM_ICE+ARG_M*3.*XL(KR)*XL(KR)*COL
6741 ARG_1=333.*SUM_ICE/RO
6746 END SUBROUTINE J_W_MELT
6747 ! +----------------------------------------------------------------------------+
6748 SUBROUTINE ONECOND1 &
6751 & ,DEL1N,DEL2N,DIV1,DIV2 &
6752 & ,FF1,PSI1,R1,RLEC,RO1BL &
6753 & ,AA1_MY,BB1_MY,AA2_MY,BB2_MY &
6755 & ,COL,DTCOND,ICEMAX,NKR,ISYM1 &
6756 ,ISYM2,ISYM3,ISYM4,ISYM5,Iin,Jin,Kin,W_in,DX_in,Itimestep)
6761 INTEGER NKR,ICEMAX, ISYM1, ISYM2(ICEMAX),ISYM3,ISYM4,ISYM5, Iin, Jin, Kin, &
6762 sea_spray_no_temp_change_per_grid, Itimestep
6763 REAL COL,VR1(NKR),PSINGLE &
6764 & ,AA1_MY,BB1_MY,AA2_MY,BB2_MY &
6765 & ,DTCOND, W_in,DX_in
6768 INTEGER I_ABERGERON,I_BERGERON, &
6769 & KR,ICE,ITIME,KCOND,NR,NRM, &
6772 REAL AL1,AL2,D,GAM,POD, &
6773 & RV_MY,CF_MY,D_MYIN,AL1_MY,AL2_MY,ALC,DT0LREF,DTLREF, &
6774 & A1_MYN, BB1_MYN, A2_MYN, BB2_MYN,DT,DTT,XRAD, &
6775 & TPC1, TPC2, TPC3, TPC4, TPC5, &
6776 & EPSDEL, EPSDEL2,DT0L, DT0I,&
6778 & CWHUCM,B6,B8L,B8I, &
6779 & DEL1,DEL2,DEL1S,DEL2S, &
6780 & TIMENEW,TIMEREV,SFN11,SFN12, &
6781 & SFNL,SFNI,B5L,B5I,B7L,B7I,DOPL,DOPI,RW,RI,QW,PW, &
6782 & PI,QI,DEL1N0,DEL2N0,D1N0,D2N0,DTNEWL,DTNEWL1,D1N,D2N, &
6783 & DEL_R1,DT0L0,DT0I0, &
6786 REAL DT_WATER_COND,DT_WATER_EVAP
6789 ! NEW ALGORITHM OF CONDENSATION (12.01.00)
6791 REAL FF1_OLD(NKR),SUPINTW(NKR)
6792 DOUBLE PRECISION DSUPINTW(NKR),DD1N,DB11_MY,DAL1,DAL2
6793 DOUBLE PRECISION COL3,RORI,TPN,TPS,QPN,QPS,TOLD,QOLD &
6794 & ,FI1_K,FI2_K,FI3_K,FI4_K,FI5_K &
6795 & ,R1_K,R2_K,R3_K,R4_K,R5_K &
6796 & ,FI1R1,FI2R2,FI3R3,FI4R4,FI5R5 &
6797 & ,RMASSLAA,RMASSLBB,RMASSIAA,RMASSIBB &
6798 & ,ES1N,ES2N,EW1N,ARGEXP &
6800 & ,DEL1N,DEL2N,DIV1,DIV2 &
6801 & ,OPER2,OPER3,AR1,AR2
6803 DOUBLE PRECISION DELMASSL1
6808 & ,RLEC(NKR),RO1BL(NKR) &
6809 & ,FI1(NKR),FF1(NKR),PSI1(NKR) &
6810 & ,B11_MY(NKR),B12_MY(NKR)
6814 ! NEW ALGORITHM OF MIXED PHASE FOR EVAPORATION
6817 REAL DTIMEO(NKR),DTIMEL(NKR) &
6820 ! NEW ALGORITHM (NO TYPE OF ICE)
6822 REAL :: FL1(NKR), sfndummy(3), R1N(NKR)
6825 DOUBLE PRECISION :: R1D(NKR),R1ND(NKR)
6827 OPER2(AR1)=0.622/(0.622+0.378*AR1)/AR1
6828 OPER3(AR1,AR2)=AR1*AR2/(0.622+0.378*AR1)
6830 DATA AL1 /2500./, AL2 /2834./, D /0.211/ &
6831 & ,GAM /1.E-4/, POD /10./
6833 DATA RV_MY,CF_MY,D_MYIN,AL1_MY,AL2_MY &
6834 & /461.5,0.24E-1,0.211E-4,2.5E6,2.834E6/
6836 DATA A1_MYN, BB1_MYN, A2_MYN, BB2_MYN &
6837 & /2.53,5.42,3.41E1,6.13/
6839 DATA TPC1, TPC2, TPC3, TPC4, TPC5 &
6840 & /-4.0,-8.1,-12.7,-17.8,-22.4/
6843 DATA EPSDEL, EPSDEL2 /0.1E-03,0.1E-03/
6845 DATA DT0L, DT0I /1.E20,1.E20/
6847 DOUBLE PRECISION :: DEL1_d , DEL2_d, RW_d , PW_d, RI_d, PI_d, D1N_d, D2N_d, &
6891 ! WARM MP (CONDENSATION OR EVAPORATION) (BEGIN)
6903 TIMEREV = DT-TIMENEW
6904 TIMEREV = DT-TIMENEW
6916 (R1D,TPS,PP,VR1_d,RLEC,RO1BL,B11_MY,1,1,fl1,NKR,ICEMAX)
6918 CALL JERTIMESC_KS(FI1,R1D,SFNDUMMY,B11_MY,B8L,1,NKR,ICEMAX,COL)
6923 SFNL = SFN11 + SFN12
6932 RW=(OPER2(QPS)+B5L*AL1)*DOPL*SFNL
6933 RI=(OPER2(QPS)+B5L*AL2)*DOPL*SFNI
6935 PW=(OPER2(QPS)+B5I*AL1)*DOPI*SFNL
6936 PI=(OPER2(QPS)+B5I*AL2)*DOPI*SFNI
6939 IF(RW.NE.RW .or. PW.NE.PW)THEN
6940 print*, 'NaN In ONECOND1'
6941 call wrf_error_fatal("fatal error in ONECOND1 (RW or PW are NaN), model stop")
6945 IF(DEL1N >= 0.0D0) KCOND=11
6947 IF(KCOND == 11) THEN
6950 DTNEWL = AMIN1(DTNEWL,TIMEREV)
6951 TIMENEW = TIMENEW + DTNEWL
6954 IF (DTT < 0.0) call wrf_error_fatal("fatal error in ONECOND1-DEL1N>0:(DTT<0), model stop")
6963 CALL JERSUPSAT_KS(DEL1_d,DEL2_d,DEL1N,DEL2N, &
6964 RW_d,PW_d,RI_d,PI_d, &
6965 DTT,D1N_d,D2N_d,0.0,0.0, &
6966 ISYM1,ISYM2,ISYM3,ISYM4,ISYM5)
6978 CALL JERDFUN_KS(R1D, R1ND, B11_MY, FI1, PSI1, fl1, D1N, &
6979 ISYM1, 1, 1, TPN, IDROP, FR_LIM, FRH_LIM, ICEMAX, NKR, COL, 1, Iin, Jin ,Kin, Itimestep)
6982 IF((DEL1.GT.0.AND.DEL1N.LT.0) &
6983 &.AND.ABS(DEL1N).GT.EPSDEL) THEN
6984 call wrf_error_fatal("fatal error in ONECOND1-1 (DEL1.GT.0.AND.DEL1N.LT.0), model stop")
6987 ! IN CASE : KCOND.EQ.11
6990 ! EVAPORATION - ONLY WATER
6991 ! IN CASE : KCOND.NE.11
6994 DTNEWL = AMIN1(DTNEWL,TIMEREV)
6995 TIMENEW = TIMENEW + DTNEWL
6998 IF (DTT < 0.0) call wrf_error_fatal("fatal error in ONECOND1-DEL1N<0:(DTT<0), model stop")
7006 CALL JERSUPSAT_KS(DEL1_d,DEL2_d,DEL1N,DEL2N, &
7007 RW_d,PW_d,RI_d,PI_d, &
7008 DTT,D1N_d,D2N_d,0.0,0.0, &
7009 ISYM1,ISYM2,ISYM3,ISYM4,ISYM5)
7021 CALL JERDFUN_KS(R1D, R1ND, B11_MY, &
7022 FI1, PSI1, fl1, D1N, &
7023 ISYM1, 1, 1, TPN, IDROP, FR_LIM, FRH_LIM, ICEMAX, NKR, COL, 1, Iin, Jin ,Kin, Itimestep)
7026 IF((DEL1.LT.0.AND.DEL1N.GT.0) &
7027 .AND.ABS(DEL1N).GT.EPSDEL) THEN
7028 call wrf_error_fatal("fatal error in ONECOND1-2 (DEL1.LT.0.AND.DEL1N.GT.0), model stop")
7037 ! ... before JERNEWF (ONLY WATER)
7041 FI1R1 = FI1_K*R1_K*R1_K
7042 RMASSLBB = RMASSLBB+FI1R1
7044 RMASSLBB = RMASSLBB*COL3*RORI
7045 IF(RMASSLBB.LE.0.) RMASSLBB=0.
7046 ! ... after JERNEWF (ONLY WATER)
7050 FI1R1=FI1_K*R1_K*R1_K
7051 RMASSLAA=RMASSLAA+FI1R1
7053 RMASSLAA=RMASSLAA*COL3*RORI
7054 IF(RMASSLAA.LE.0.) RMASSLAA=0.
7056 DELMASSL1 = RMASSLAA - RMASSLBB
7057 QPN = QPS - DELMASSL1
7059 TPN = TPS + DAL1*DELMASSL1
7061 IF(ABS(DAL1*DELMASSL1) > 3.0 )THEN
7062 print*,"ONECOND1-in(start)"
7063 print*,"I=",Iin,"J=",Jin,"Kin",Kin,"W",w_in,"DX",dx_in
7064 print*,"DELMASSL1",DELMASSL1,"DT",DTT
7065 print*,"DEL1N,DEL2N,DEL1,DEL2,D1N,D2N,RW,PW,RI,PI,DT"
7066 print*,DEL1N,DEL2N,DEL1,DEL2,D1N,D2N,RW,PW,RI,PI,DTT
7067 print*,"TPS",TPS,"QPS",QPS
7068 print*,'FI1 before',FI1,'PSI1 after',PSI1
7069 print*,"ONECOND1-in(end)"
7070 call wrf_error_fatal("fatal error in ONECOND1-in (ABS(DAL1*DELMASSL1) > 3.0), model stop")
7075 SUPINTW(KR)=SUPINTW(KR)+B11_MY(KR)*D1N
7078 DSUPINTW(KR)=DSUPINTW(KR)+DB11_MY*DD1N
7082 ! ... REPEATE TIME STEP (ONLY WATER: CONDENSATION OR EVAPORATION)
7083 IF(TIMENEW.LT.DT) GOTO 56
7088 CALL JERDFUN_NEW_KS (R1D,R1ND,SUPINTW, &
7090 TPN,IDROP,FR_LIM, NKR, COL,1,Iin,Jin,Kin,Itimestep)
7091 ENDIF ! in case ISYM1/=0
7099 FI1R1=FI1_K*R1_K*R1_K
7100 RMASSLBB=RMASSLBB+FI1R1
7102 RMASSLBB=RMASSLBB*COL3*RORI
7103 IF(RMASSLBB.LT.0.0) RMASSLBB=0.0
7108 FI1R1=FI1_K*R1_K*R1_K
7109 RMASSLAA=RMASSLAA+FI1R1
7111 RMASSLAA=RMASSLAA*COL3*RORI
7112 IF(RMASSLAA.LT.0.0) RMASSLAA=0.0
7113 DELMASSL1 = RMASSLAA-RMASSLBB
7115 QPN = QOLD - DELMASSL1
7117 TPN = TOLD + DAL1*DELMASSL1
7119 IF(ABS(DAL1*DELMASSL1) > 5.0 )THEN
7120 print*,"ONECOND1-out (start)"
7121 print*,"I=",Iin,"J=",Jin,"Kin",Kin,"W",w_in,"DX",dx_in
7122 print*,"DEL1N,DEL2N,D1N,D2N,RW,PW,RI,PI,DT"
7123 print*,DEL1N,DEL2N,D1N,D2N,RW,PW,RI,PI,DTT
7124 print*,"I=",Iin,"J=",Jin,"Kin",Kin
7125 print*,"TPS=",TPS,"QPS=",QPS,"delmassl1",delmassl1
7127 print*,RMASSLBB,RMASSLAA
7130 print*,"ONECOND1-out (end)"
7131 IF(ABS(DAL1*DELMASSL1) > 5.0 )THEN
7132 call wrf_error_fatal("fatal error in ONECOND1-out (ABS(DAL1*DELMASSL1) > 5.0), model stop")
7143 END SUBROUTINE ONECOND1
7144 ! +----------------------------------------------------------------------------+
7145 SUBROUTINE ONECOND2 &
7147 & ,VR2,VR3,VR4,VR5,PSINGLE &
7148 & ,DEL1N,DEL2N,DIV1,DIV2 &
7149 & ,FF2,PSI2,R2,RIEC,RO2BL &
7150 & ,FF3,PSI3,R3,RSEC,RO3BL &
7151 & ,FF4,PSI4,R4,RGEC,RO4BL &
7152 & ,FF5,PSI5,R5,RHEC,RO5BL &
7153 & ,AA1_MY,BB1_MY,AA2_MY,BB2_MY &
7155 & ,COL,DTCOND,ICEMAX,NKR &
7156 & ,ISYM1,ISYM2,ISYM3,ISYM4,ISYM5, &
7157 Iin,Jin,Kin,W_in,DX_in,Itimestep)
7161 INTEGER NKR,ICEMAX,ISYM1, Iin, Jin, Kin, Itimestep
7162 REAL COL,VR2(NKR,ICEMAX),VR3(NKR),VR4(NKR) &
7163 & ,VR5(NKR),PSINGLE &
7164 & ,AA1_MY,BB1_MY,AA2_MY,BB2_MY &
7165 & ,DTCOND,W_in,DX_in
7168 INTEGER I_MIXCOND,I_MIXEVAP,I_ABERGERON,I_BERGERON, &
7169 & KR,ICE,ITIME,ICM,KCOND,NR,NRM,INUC, &
7170 & ISYM2(ICEMAX),ISYM3,ISYM4,ISYM5,KP,KLIMIT, &
7171 & KM,ITER,KLIMITL,KLIMITG,KLIMITH,KLIMITI_1,KLIMITI_2,KLIMITI_3, &
7173 REAL AL1,AL2,D,GAM,POD, &
7174 & RV_MY,CF_MY,D_MYIN,AL1_MY,AL2_MY,ALC,DT0LREF,DTLREF, &
7175 & A1_MYN, BB1_MYN, A2_MYN, BB2_MYN,DT,DTT,XRAD, &
7176 & TPC1, TPC2, TPC3, TPC4, TPC5, &
7177 & EPSDEL, DT0L, DT0I, &
7179 & DEL1NUC,DEL2NUC, &
7180 & CWHUCM,B6,B8L,B8I,RMASSGL,RMASSGI, &
7181 & DEL1,DEL2,DEL1S,DEL2S, &
7182 & TIMENEW,TIMEREV,SFN11,SFN12, &
7183 & SFNL,SFNI,B5L,B5I,B7L,B7I,DOPL,DOPI,OPERQ,RW,RI,QW,PW, &
7184 & PI,QI,D1N0,D2N0,DTNEWL,DTNEWL1,D1N,D2N, &
7185 & DEL_R1,DT0L0,DT0I0,SFN31,SFN32,SFN52, &
7186 & SFNII1,SFN21,SFN22,DTNEWI3,DTNEWI4,DTNEWI5,DTNEWI2_1, &
7187 & DTNEWI2_2,DTNEWI1,DEL_R2,DEL_R4,DEL_R5,SFN41,SFN42, &
7188 & SNF51,DTNEWI2_3,DTNEWI2,DTNEWI_1,DTNEWI_2, &
7189 & DTNEWL0,DTNEWG1,DTNEWH1,DTNEWI_3, &
7190 & DTNEWL2,SFN51,SFNII2,DEL_R3,DTNEWI
7191 REAL DT_WATER_COND,DT_WATER_EVAP,DT_ICE_COND,DT_ICE_EVAP, &
7192 & DT_MIX_COND,DT_MIX_EVAP,DT_MIX_BERGERON,DT_MIX_ANTIBERGERON
7196 DOUBLE PRECISION DD1N,DB11_MY,DAL1,DAL2
7197 DOUBLE PRECISION COL3,RORI,TPN,TPS,QPN,QPS,TOLD,QOLD &
7198 & ,FI1_K,FI2_K,FI3_K,FI4_K,FI5_K &
7199 & ,R1_K,R2_K,R3_K,R4_K,R5_K &
7200 & ,FI1R1,FI2R2,FI3R3,FI4R4,FI5R5 &
7201 & ,RMASSLAA,RMASSLBB,RMASSIAA,RMASSIBB &
7202 & ,ES1N,ES2N,EW1N,ARGEXP &
7204 & ,DEL1N,DEL2N,DIV1,DIV2 &
7205 & ,OPER2,OPER3,AR1,AR2
7207 DOUBLE PRECISION DELTAQ1,DELMASSI1,DELMASSL1
7213 REAL R2(NKR,ICEMAX) &
7214 & ,RIEC(NKR,ICEMAX) &
7215 & ,RO2BL(NKR,ICEMAX) &
7216 & ,FI2(NKR,ICEMAX),PSI2(NKR,ICEMAX) &
7217 & ,FF2(NKR,ICEMAX) &
7218 & ,B21_MY(NKR,ICEMAX),B22_MY(NKR,ICEMAX)
7222 & ,RSEC(NKR),RO3BL(NKR) &
7223 & ,FI3(NKR),FF3(NKR),PSI3(NKR) &
7224 & ,B31_MY(NKR),B32_MY(NKR)
7229 & ,RGEC(NKR),RO4BL(NKR) &
7230 & ,FI4(NKR),FF4(NKR),PSI4(NKR) &
7231 & ,B41_MY(NKR),B42_MY(NKR)
7235 & ,RHEC(NKR),RO5BL(NKR) &
7236 & ,FI5(NKR),FF5(NKR),PSI5(NKR) &
7237 & ,B51_MY(NKR),B52_MY(NKR)
7241 REAL DTIMEG(NKR),DTIMEH(NKR)
7243 REAL DEL2D(ICEMAX),DTIMEO(NKR),DTIMEL(NKR) &
7245 & ,DTIMEI_1(NKR),DTIMEI_2(NKR),DTIMEI_3(NKR) &
7246 & ,SFNI1(ICEMAX),SFNI2(ICEMAX) &
7248 & ,FI1REF(NKR),PSI1REF(NKR) &
7249 & ,FI2REF(NKR,ICEMAX),PSI2REF(NKR,ICEMAX)&
7252 REAL :: FL1(NKR), sfndummy(3), FL3(NKR), FL4(NKR), FL5(NKR), &
7253 R2N(NKR,ICEMAX), R3N(NKR), R4N(NKR), R5N(NKR)
7254 INTEGER :: IDROP, ISYMICE
7255 DOUBLE PRECISION :: R2D(NKR,ICEMAX),R3D(NKR), R4D(NKR), R5D(NKR), &
7256 R2ND(NKR,ICEMAX),R3ND(NKR), R4ND(NKR), R5ND(NKR), &
7257 VR2_d(NKR,ICEMAX), VR3_d(NKR), VR4_d(NKR), VR5_d(NKR)
7259 OPER2(AR1)=0.622/(0.622+0.378*AR1)/AR1
7260 OPER3(AR1,AR2)=AR1*AR2/(0.622+0.378*AR1)
7262 DATA AL1 /2500./, AL2 /2834./, D /0.211/ &
7263 & ,GAM /1.E-4/, POD /10./
7265 DATA RV_MY,CF_MY,D_MYIN,AL1_MY,AL2_MY &
7266 & /461.5,0.24E-1,0.211E-4,2.5E6,2.834E6/
7268 DATA A1_MYN, BB1_MYN, A2_MYN, BB2_MYN &
7269 & /2.53,5.42,3.41E1,6.13/
7271 DATA TPC1, TPC2, TPC3, TPC4, TPC5 &
7272 & /-4.0,-8.1,-12.7,-17.8,-22.4/
7274 DATA EPSDEL/0.1E-03/
7276 DATA DT0L, DT0I /1.E20,1.E20/
7278 DOUBLE PRECISION :: DEL1_d, DEL2_d, RW_d, PW_d, RI_d, PI_d, D1N_d, D2N_d
7320 DT_MIX_ANTIBERGERON=0.4
7352 ! ONLY ICE (CONDENSATION OR EVAPORATION) :
7354 46 ITIME = ITIME + 1
7372 FI2(KR,ICE)=PSI2(KR,ICE)
7376 IF(sum(ISYM2) > 0) THEN
7380 CALL JERRATE_KS (R2D,TPS,PP,VR2_d,RIEC,RO2BL,B21_MY,3,2,fl1,NKR,ICEMAX)
7382 CALL JERTIMESC_KS (FI2,R2D,SFNI1,B21_MY,B8I,ICM,NKR,ICEMAX,COL)
7388 CALL JERRATE_KS (R3D,TPS,PP,VR3_d,RSEC,RO3BL,B31_MY,1,3,fl3,NKR,ICEMAX)
7391 CALL JERTIMESC_KS(FI3,R3D,SFNDUMMY,B31_MY,B8I,1,NKR,ICEMAX,COL)
7398 CALL JERRATE_KS(R4D,TPS,PP,VR4_d,RGEC,RO4BL,B41_MY,1,2,fl4,NKR,ICEMAX)
7401 CALL JERTIMESC_KS(FI4,R4D,SFNDUMMY,B41_MY,B8I,1,NKR,ICEMAX,COL)
7408 CALL JERRATE_KS(R5D,TPS,PP,VR5_d,RHEC,RO5BL,B51_MY,1,2,fl5,NKR,ICEMAX)
7411 CALL JERTIMESC_KS(FI5,R5D,SFNDUMMY,B51_MY,B8I,1,NKR,ICEMAX,COL)
7416 SFNII1 = SFNI1(1) + SFNI1(2) + SFNI1(3)
7417 SFN21 = SFNII1 + SFN31 + SFN41 + SFN51
7420 SFNI = SFN21 + SFN22
7429 RW=(OPERQ+B5L*AL1)*DOPL*SFNL
7431 PW=(OPERQ+B5I*AL1)*DOPI*SFNL
7432 RI=(OPERQ+B5L*AL2)*DOPL*SFNI
7433 PI=(OPERQ+B5I*AL2)*DOPI*SFNI
7437 IF(DEL2N > 0.0) KCOND=21
7439 IF(RW.NE.RW .or. PW.NE.PW)THEN
7440 print*, 'NaN In ONECOND2'
7441 call wrf_error_fatal("fatal error in ONECOND2 (RW or PW are NaN), model stop")
7445 IF(KCOND == 21) THEN
7446 ! ... ONLY_ICE: CONDENSATION
7448 DTNEWL = AMIN1(DTNEWL,TIMEREV)
7449 TIMENEW = TIMENEW + DTNEWL
7452 IF (DTT < 0.0) call wrf_error_fatal("fatal error in ONECOND2-DEL2N>0:(DTT<0), model stop")
7460 CALL JERSUPSAT_KS(DEL1_d,DEL2_d,DEL1N,DEL2N, &
7461 RW_d,PW_d,RI_d,PI_d, &
7462 DTT,D1N_d,D2N_d,0.0,0.0, &
7463 ISYM1,ISYM2,ISYM3,ISYM4,ISYM5)
7473 IF(sum(ISYM2) > 0)THEN
7476 IF(ISYM2(1) == 1) THEN
7477 CALL JERDFUN_KS(R2D(:,1), R2ND(:,1), B21_MY(:,1), &
7478 FI2(:,1), PSI2(:,1), fl1, D2N, &
7479 ISYM2(1), ICM, 1, TPN, IDROP, FR_LIM, FRH_LIM, ICEMAX, NKR, COL, 21, Iin, Jin ,Kin, Itimestep)
7481 IF(ISYM2(2) == 1) THEN
7482 CALL JERDFUN_KS(R2D(:,2), R2ND(:,2), B21_MY(:,2), &
7483 FI2(:,2), PSI2(:,2), fl1, D2N, &
7484 ISYM2(2), ICM, 2, TPN, IDROP, FR_LIM, FRH_LIM, ICEMAX, NKR, COL, 22, Iin, Jin ,Kin, Itimestep)
7486 IF(ISYM2(3) == 1) THEN
7487 CALL JERDFUN_KS(R2D(:,3), R2ND(:,3), B21_MY(:,3), &
7488 FI2(:,3), PSI2(:,3), fl1, D2N, &
7489 ISYM2(3), ICM, 3, TPN, IDROP, FR_LIM, FRH_LIM, ICEMAX, NKR, COL, 23, Iin, Jin ,Kin, Itimestep)
7491 ! IN CASE : ISYM2.NE.0
7498 CALL JERDFUN_KS(R3D, R3ND, B31_MY, &
7499 FI3, PSI3, fl3, D2N, &
7500 ISYM3, 1, 3, TPN, IDROP, FR_LIM, FRH_LIM, ICEMAX, NKR, COL, 3, Iin, Jin ,Kin, Itimestep)
7507 CALL JERDFUN_KS(R4D, R4ND, B41_MY, &
7508 FI4, PSI4, fl4, D2N, &
7509 ISYM4, 1, 4, TPN, IDROP, FR_LIM, FRH_LIM, ICEMAX, NKR, COL, 4, Iin, Jin ,Kin, Itimestep)
7510 ! IN CASE : ISYM4.NE.0
7516 CALL JERDFUN_KS(R5D, R5ND, B51_MY, &
7517 FI5, PSI5, fl5, D2N, &
7518 ISYM5, 1, 5, TPN, IDROP, FR_LIM, FRH_LIM, ICEMAX, NKR, COL, 5, Iin, Jin ,Kin, Itimestep)
7519 ! IN CASE : ISYM5.NE.0
7522 IF((DEL2.GT.0.AND.DEL2N.LT.0) &
7523 .AND.ABS(DEL2N).GT.EPSDEL) THEN
7524 call wrf_error_fatal("fatal error in module_mp_fast_sbm (DEL2.GT.0.AND.DEL2N.LT.0), model stop")
7528 ! ... IN CASE KCOND.NE.21
7529 ! ONLY ICE: EVAPORATION
7531 DTNEWL = AMIN1(DTNEWL,TIMEREV)
7532 TIMENEW = TIMENEW + DTNEWL
7535 IF (DTT < 0.0) call wrf_error_fatal("fatal error in ONECOND2-DEL2N<0:(DTT<0), model stop")
7543 CALL JERSUPSAT_KS(DEL1_d,DEL2_d,DEL1N,DEL2N, &
7544 RW_d,PW_d,RI_d,PI_d, &
7545 DTT,D1N_d,D2N_d,0.0,0.0, &
7546 ISYM1,ISYM2,ISYM3,ISYM4,ISYM5)
7556 IF(sum(ISYM2) > 0) THEN
7560 CALL JERDFUN_KS(R2D(:,1), R2ND(:,1), B21_MY(:,1), &
7561 FI2(:,1), PSI2(:,1), fl1, D2N, &
7562 ISYM2(1), ICM, 1, TPN, IDROP, FR_LIM, FRH_LIM, ICEMAX, NKR, COL, 21, Iin, Jin ,Kin, Itimestep)
7565 CALL JERDFUN_KS(R2D(:,2), R2ND(:,2), B21_MY(:,2), &
7566 FI2(:,2), PSI2(:,2), fl1, D2N, &
7567 ISYM2(2), ICM, 2, TPN, IDROP, FR_LIM, FRH_LIM, ICEMAX, NKR, COL, 22, Iin, Jin ,Kin, Itimestep)
7570 CALL JERDFUN_KS(R2D(:,3), R2ND(:,3), B21_MY(:,3), &
7571 FI2(:,3), PSI2(:,3), fl1, D2N, &
7572 ISYM2(3), ICM, 3, TPN, IDROP, FR_LIM, FRH_LIM, ICEMAX, NKR, COL, 23, Iin, Jin ,Kin, Itimestep)
7580 CALL JERDFUN_KS(R3D, R3ND, B31_MY, &
7581 FI3, PSI3, fl3, D2N, &
7582 ISYM3, 1, 3, TPN, IDROP, FR_LIM, FRH_LIM, ICEMAX, NKR, COL, 3, Iin, Jin ,Kin, Itimestep)
7583 ! IN CASE : ISYM3.NE.0
7587 ! ... GRAUPELS (ONLY_ICE: EVAPORATION)
7591 CALL JERDFUN_KS(R4D, R4ND, B41_MY, &
7592 FI4, PSI4, fl4, D2N, &
7593 ISYM4, 1, 4, TPN, IDROP, FR_LIM, FRH_LIM, ICEMAX, NKR, COL, 4, Iin, Jin ,Kin, Itimestep)
7594 ! IN CASE : ISYM4.NE.0
7598 ! ... HAIL (ONLY_ICE: EVAPORATION)
7602 CALL JERDFUN_KS(R5D, R5ND, B51_MY, &
7603 FI5, PSI5, fl5, D2N, &
7604 ISYM5, 1, 5, TPN, IDROP, FR_LIM, FRH_LIM, ICEMAX, NKR, COL, 5, Iin, Jin ,Kin, Itimestep)
7605 ! IN CASE : ISYM5.NE.0
7608 IF((DEL2.LT.0.AND.DEL2N.GT.0) &
7609 .AND.ABS(DEL2N).GT.EPSDEL) THEN
7610 call wrf_error_fatal("fatal error in module_mp_fast_sbm (DEL2.LT.0.AND.DEL2N.GT.0), model stop")
7613 ! IN CASE : KCOND.NE.21
7624 FI2R2 = FI2_K*R2_K*R2_K
7625 RMASSIBB = RMASSIBB + FI2R2
7633 FI3R3=FI3_K*R3_K*R3_K
7634 FI4R4=FI4_K*R4_K*R4_K
7635 FI5R5=FI5_K*R5_K*R5_K
7636 RMASSIBB=RMASSIBB+FI3R3
7637 RMASSIBB=RMASSIBB+FI4R4
7638 RMASSIBB=RMASSIBB+FI5R5
7640 RMASSIBB=RMASSIBB*COL3*RORI
7641 IF(RMASSIBB.LT.0.0) RMASSIBB=0.0
7647 FI2R2=FI2_K*R2_K*R2_K
7648 RMASSIAA=RMASSIAA+FI2R2
7656 FI3R3=FI3_K*R3_K*R3_K
7657 FI4R4=FI4_K*R4_K*R4_K
7658 FI5R5=FI5_K*R5_K*R5_K
7659 RMASSIAA=RMASSIAA+FI3R3
7660 RMASSIAA=RMASSIAA+FI4R4
7661 RMASSIAA=RMASSIAA+FI5R5
7663 RMASSIAA = RMASSIAA*COL3*RORI
7665 IF(RMASSIAA.LT.0.0) RMASSIAA=0.0
7667 DELMASSI1 = RMASSIAA-RMASSIBB
7670 TPN = TPS+DAL2*DELMASSI1
7672 IF(ABS(DAL2*DELMASSI1) > 5.0 )THEN
7673 print*,"ONECOND2-out (start)"
7674 print*,"I=",Iin,"J=",Jin,"Kin",Kin,"W",w_in,"DX",dx_in
7675 print*,"DEL1N,DEL2N,D1N,D2N,RW,PW,RI,PI,DT"
7676 print*,DEL1N,DEL2N,D1N,D2N,RW,PW,RI,PI,DTT
7677 print*,"TPS=",TPS,"QPS=",QPS,"delmassi1",delmassi1
7679 print*,RMASSIBB,RMASSIAA
7680 print*,"FI2_1",FI2(:,1)
7681 print*,"FI2_2",FI2(:,2)
7682 print*,"FI2_3",FI2(:,3)
7686 print*,"PSI2_1",PSI2(:,1)
7687 print*,"PSI2_2",PSI2(:,2)
7688 print*,"PSI2_3",PSI2(:,3)
7692 print*,"ONECOND2-out (end)"
7693 IF(ABS(DAL2*DELMASSI1) > 5.0 )THEN
7694 call wrf_error_fatal("fatal error in ONECOND2-out (ABS(DAL2*DELMASSI1) > 5.0), model stop")
7698 ! END OF TIME SPLITTING
7699 ! (ONLY ICE: CONDENSATION OR EVAPORATION)
7700 IF(TIMENEW.LT.DT) GOTO 46
7706 FF2(KR,ICE)=PSI2(KR,ICE)
7714 END SUBROUTINE ONECOND2
7715 ! +----------------------------------------------------------------------------+
7716 SUBROUTINE ONECOND3 &
7718 & ,VR1,VR2,VR3,VR4,VR5,PSINGLE &
7719 & ,DEL1N,DEL2N,DIV1,DIV2 &
7720 & ,FF1,PSI1,R1,RLEC,RO1BL &
7721 & ,FF2,PSI2,R2,RIEC,RO2BL &
7722 & ,FF3,PSI3,R3,RSEC,RO3BL &
7723 & ,FF4,PSI4,R4,RGEC,RO4BL &
7724 & ,FF5,PSI5,R5,RHEC,RO5BL &
7725 & ,AA1_MY,BB1_MY,AA2_MY,BB2_MY &
7727 & ,COL,DTCOND,ICEMAX,NKR &
7728 & ,ISYM1,ISYM2,ISYM3,ISYM4,ISYM5, &
7729 Iin,Jin,Kin,W_in,DX_in, Itimestep)
7732 INTEGER ICEMAX,NKR,KR,ITIME,ICE,KCOND,K &
7733 & ,ISYM1,ISYM2(ICEMAX),ISYM3,ISYM4,ISYM5, Kin, Iin, Jin, Itimestep
7734 INTEGER KLIMITL,KLIMITG,KLIMITH,KLIMITI_1, &
7735 & KLIMITI_2,KLIMITI_3
7736 INTEGER I_MIXCOND,I_MIXEVAP,I_ABERGERON,I_BERGERON
7737 REAL ROR,VR1(NKR),VR2(NKR,ICEMAX),VR3(NKR),VR4(NKR) &
7738 & ,VR5(NKR),PSINGLE &
7739 & ,AA1_MY,BB1_MY,AA2_MY,BB2_MY &
7741 & ,COL,DTCOND,W_in,DX_in
7746 & ,RLEC(NKR),RO1BL(NKR) &
7747 & ,FI1(NKR),FF1(NKR),PSI1(NKR) &
7748 & ,B11_MY(NKR),B12_MY(NKR)
7752 REAL R2(NKR,ICEMAX) &
7753 & ,RIEC(NKR,ICEMAX) &
7754 & ,RO2BL(NKR,ICEMAX) &
7755 & ,FI2(NKR,ICEMAX),PSI2(NKR,ICEMAX) &
7756 & ,FF2(NKR,ICEMAX) &
7757 & ,B21_MY(NKR,ICEMAX),B22_MY(NKR,ICEMAX) &
7758 & ,RATE2(NKR,ICEMAX),DEL_R2M(NKR,ICEMAX)
7762 & ,RSEC(NKR),RO3BL(NKR) &
7763 & ,FI3(NKR),FF3(NKR),PSI3(NKR) &
7764 & ,B31_MY(NKR),B32_MY(NKR) &
7770 & ,RGEC(NKR),RO4BL(NKR) &
7771 & ,FI4(NKR),FF4(NKR),PSI4(NKR) &
7772 & ,B41_MY(NKR),B42_MY(NKR) &
7777 & ,RHEC(NKR),RO5BL(NKR) &
7778 & ,FI5(NKR),FF5(NKR),PSI5(NKR) &
7779 & ,B51_MY(NKR),B52_MY(NKR) &
7782 DOUBLE PRECISION DD1N,DB11_MY,DAL1,DAL2
7783 DOUBLE PRECISION COL3,RORI,TPN,TPS,QPN,QPS,TOLD,QOLD &
7784 & ,FI1_K,FI2_K,FI3_K,FI4_K,FI5_K &
7785 & ,R1_K,R2_K,R3_K,R4_K,R5_K &
7786 & ,FI1R1,FI2R2,FI3R3,FI4R4,FI5R5 &
7787 & ,RMASSLAA,RMASSLBB,RMASSIAA,RMASSIBB &
7788 & ,ES1N,ES2N,EW1N,ARGEXP &
7789 & ,TT,QQ,PP,DEL1N0,DEL2N0 &
7790 & ,DEL1N,DEL2N,DIV1,DIV2 &
7791 & ,OPER2,OPER3,AR1,AR2
7793 DOUBLE PRECISION DELTAQ1,DELMASSI1,DELMASSL1
7795 REAL A1_MYN, BB1_MYN, A2_MYN, BB2_MYN
7796 DATA A1_MYN, BB1_MYN, A2_MYN, BB2_MYN &
7797 & /2.53,5.42,3.41E1,6.13/
7798 REAL B8L,B8I,SFN11,SFN12,SFNL,SFNI
7799 REAL B5L,B5I,B7L,B7I,B6,DOPL,DEL1S,DEL2S,DOPI,RW,QW,PW, &
7800 & RI,PI,QI,SFNI1(ICEMAX),SFNI2(ICEMAX),AL1,AL2
7801 REAL D1N,D2N,DT0L, DT0I,D1N0,D2N0
7802 REAL SFN21,SFN22,SFNII1,SFNII2,SFN31,SFN32,SFN41,SFN42,SFN51, &
7805 REAL TIMEREV,DT,DTT,TIMENEW
7806 REAL DTIMEG(NKR),DTIMEH(NKR),totccn_before,totccn_after
7808 REAL DEL2D(ICEMAX),DTIMEO(NKR),DTIMEL(NKR) &
7809 & ,DTIMEI_1(NKR),DTIMEI_2(NKR),DTIMEI_3(NKR)
7810 REAL DT_WATER_COND,DT_WATER_EVAP,DT_ICE_COND,DT_ICE_EVAP, &
7811 & DT_MIX_COND,DT_MIX_EVAP,DT_MIX_BERGERON,DT_MIX_ANTIBERGERON
7812 REAL DTNEWL0,DTNEWL1,DTNEWI1,DTNEWI2_1,DTNEWI2_2,DTNEWI2_3, &
7813 & DTNEWI2,DTNEWI_1,DTNEWI_2,DTNEWI3,DTNEWI4,DTNEWI5, &
7814 & DTNEWL,DTNEWL2,DTNEWG1,DTNEWH1
7817 DATA AL1 /2500./, AL2 /2834./
7819 DATA EPSDEL, EPSDEL2 /0.1E-03,0.1E-03/
7821 REAL :: FL1(NKR), FL2(NKR,ICEMAX), FL3(NKR), FL4(NKR), FL5(NKR), SFNDUMMY(3), &
7822 R1N(NKR), R2N(NKR,ICEMAX), R3N(NKR), R4N(NKR), R5N(NKR)
7823 INTEGER :: IDROP, ICM, ISYMICE
7824 DOUBLE PRECISION :: R1D(NKR),R2D(NKR,ICEMAX),R3D(NKR), R4D(NKR), R5D(NKR), &
7825 R1ND(NKR),R2ND(NKR,ICEMAX),R3ND(NKR), R4ND(NKR), R5ND(NKR)
7828 DATA DT0L, DT0I /1.E20,1.E20/
7830 DOUBLE PRECISION :: DEL1_d, DEL2_d , RW_d, PW_d , RI_d , PI_d , D1N_d, D2N_d, &
7831 VR1_d(NKR), VR2_d(NKR,ICEMAX), VR3_d(NKR), VR4_d(NKR), VR5_d(NKR), &
7832 TTinput,QQinput,DEL1Ninput,DEL2Ninput
7834 OPER2(AR1)=0.622/(0.622+0.378*AR1)/AR1
7835 OPER3(AR1,AR2)=AR1*AR2/(0.622+0.378*AR1)
7886 DT_MIX_ANTIBERGERON=0.4
7907 16 ITIME = ITIME + 1
7908 IF((TPN-273.15).GE.-0.187) GO TO 17
7909 TIMEREV = DT - TIMENEW
7926 FI2(KR,ICE) = PSI2(KR,ICE)
7933 (R1D,TPS,PP,VR1_d,RLEC,RO1BL,B11_MY,1,1,fl1,NKR,ICEMAX)
7936 CALL JERTIMESC_KS(FI1,R1D,SFNDUMMY,B11_MY,B8L,1,NKR,ICEMAX,COL)
7940 IF(sum(ISYM2) > 0) THEN
7943 CALL JERRATE_KS (R2D,TPS,PP,VR2_d,RIEC,RO2BL,B21_MY,3,2,fl1,NKR,ICEMAX)
7944 CALL JERTIMESC_KS (FI2,R2D,SFNI1,B21_MY,B8I,ICM,NKR,ICEMAX,COL)
7949 CALL JERRATE_KS (R3D,TPS,PP,VR3_d,RSEC,RO3BL,B31_MY,1,3,fl3,NKR,ICEMAX)
7951 CALL JERTIMESC_KS(FI3,R3D,SFNDUMMY,B31_MY,B8I,1,NKR,ICEMAX,COL)
7957 CALL JERRATE_KS(R4D,TPS,PP,VR4_d,RGEC,RO4BL,B41_MY,1,2,fl4,NKR,ICEMAX)
7959 CALL JERTIMESC_KS(FI4,R4D,SFNDUMMY,B41_MY,B8I,1,NKR,ICEMAX,COL)
7965 CALL JERRATE_KS(R5D,TPS,PP,VR5_d,RHEC,RO5BL,B51_MY,1,2,fl5,NKR,ICEMAX)
7967 CALL JERTIMESC_KS(FI5,R5D,SFNDUMMY,B51_MY,B8I,1,NKR,ICEMAX,COL)
7971 SFNII1 = SFNI1(1) + SFNI1(2) + SFNI1(3)
7972 SFN21 = SFNII1 + SFN31 + SFN41 + SFN51
7974 SFNL = SFN11 + SFN12
7976 SFNI = SFN21 + SFN22
7984 RW=(OPER2(QPS)+B5L*AL1)*DOPL*SFNL
7986 PW=(OPER2(QPS)+B5I*AL1)*DOPI*SFNL
7987 RI=(OPER2(QPS)+B5L*AL2)*DOPL*SFNI
7988 PI=(OPER2(QPS)+B5I*AL2)*DOPI*SFNI
7991 IF(RW.NE.RW .or. PW.NE.PW)THEN
7992 print*, 'NaN In ONECOND3'
7993 call wrf_error_fatal("fatal error in ONECOND3 (RW or PW are NaN), model stop")
7996 ! DEL1 > 0, DEL2 < 0 (ANTIBERGERON MIXED PHASE - KCOND=50)
7997 ! DEL1 < 0 AND DEL2 < 0 (EVAPORATION MIXED_PHASE - KCOND=30)
7998 ! DEL1 > 0 AND DEL2 > 0 (CONDENSATION MIXED PHASE - KCOND=31)
7999 ! DEL1 < 0, DEL2 > 0 (BERGERON MIXED PHASE - KCOND=32)
8002 IF(DEL1N .LT. 0.0 .AND. DEL2N .LT. 0.0) KCOND=30
8003 IF(DEL1N .GT. 0.0 .AND. DEL2N .GT. 0.0) KCOND=31
8004 IF(DEL1N .LT. 0.0 .AND. DEL2N .GT. 0.0) KCOND=32
8006 IF(KCOND == 50) THEN
8008 DTNEWL = AMIN1(DTNEWL,TIMEREV)
8009 TIMENEW = TIMENEW + DTNEWL
8012 ! ... Incase the Anti-Bregeron regime we do not call diffusional-growth
8013 PRINT*, "Anti-Bregeron Regime, No DIFFU"
8014 PRINT*, DEL1, DEL2, TT, QQ, Kin
8016 ! IN CASE : KCOND = 50
8018 IF(KCOND == 31) THEN
8019 ! ... DEL1 > 0 AND DEL2 > 0 (CONDENSATION MIXED PHASE - KCOND=31)
8020 ! ... CONDENSATION MIXED PHASE (BEGIN)
8022 DTNEWL = AMIN1(DTNEWL,TIMEREV)
8023 TIMENEW = TIMENEW + DTNEWL
8025 ! CONDENSATION MIXED PHASE (END)
8026 ! IN CASE : KCOND = 31
8028 IF(KCOND == 30) THEN
8029 ! ... DEL1 < 0 AND DEL2 < 0 (EVAPORATION MIXED_PHASE - KCOND=30)
8030 ! ... EVAPORATION MIXED PHASE (BEGIN)
8032 DTNEWL = AMIN1(DTNEWL,TIMEREV)
8033 TIMENEW = TIMENEW + DTNEWL
8035 ! EVAPORATION MIXED PHASE (END)
8036 ! IN CASE : KCOND = 30
8038 IF(KCOND == 32) THEN
8039 ! ... IF(DEL1N < 0.0 .AND. DEL2N > 0.0) KCOND=32
8040 ! ... BERGERON MIXED PHASE (BEGIN)
8042 DTNEWL = AMIN1(DTNEWL,TIMEREV)
8043 TIMENEW = TIMENEW + DTNEWL
8045 ! BERGERON MIXED PHASE (END)
8046 ! IN CASE : KCOND = 32
8049 IF (DTT < 0.0) call wrf_error_fatal("fatal error in ONECOND3:(DTT<0), model stop")
8057 CALL JERSUPSAT_KS(DEL1_d,DEL2_d,DEL1N,DEL2N, &
8058 RW_d,PW_d,RI_d,PI_d, &
8059 DTT,D1N_d,D2N_d,0.0,0.0, &
8060 ISYM1,ISYM2,ISYM3,ISYM4,ISYM5)
8072 ! DROPLET DISTRIBUTION FUNCTION
8075 CALL JERDFUN_KS(R1D, R1ND, B11_MY, &
8076 FI1, PSI1, fl1, D1N, &
8077 ISYM1, 1, 1, TPN, IDROP, FR_LIM, FRH_LIM, ICEMAX, NKR, COL, 1, Iin, Jin ,Kin, Itimestep)
8078 ! IN CASE ISYM1.NE.0
8080 IF(sum(ISYM2) > 0) THEN
8085 CALL JERDFUN_KS(R2D(:,1), R2ND(:,1), B21_MY(:,1), &
8086 FI2(:,1), PSI2(:,1), fl1, D2N, &
8087 ISYM2(1), ICM, 1, TPN, IDROP, FR_LIM, FRH_LIM, ICEMAX, NKR, COL, 21, Iin, Jin ,Kin, Itimestep)
8090 CALL JERDFUN_KS(R2D(:,2), R2ND(:,2), B21_MY(:,2), &
8091 FI2(:,2), PSI2(:,2), fl1, D2N, &
8092 ISYM2(2), ICM, 2, TPN, IDROP, FR_LIM, FRH_LIM, ICEMAX, NKR, COL, 22, Iin, Jin ,Kin, Itimestep)
8095 CALL JERDFUN_KS(R2D(:,3), R2ND(:,3), B21_MY(:,3), &
8096 FI2(:,3), PSI2(:,3), fl1, D2N, &
8097 ISYM2(3), ICM, 3, TPN, IDROP, FR_LIM, FRH_LIM, ICEMAX, NKR, COL, 23, Iin, Jin ,Kin, Itimestep)
8105 CALL JERDFUN_KS(R3D, R3ND, B31_MY, &
8106 FI3, PSI3, fl3, D2N, &
8107 ISYM3, 1, 3, TPN, IDROP, FR_LIM, FRH_LIM, ICEMAX, NKR, COL, 3, Iin, Jin ,Kin, Itimestep)
8108 ! IN CASE ISYM3.NE.0
8115 CALL JERDFUN_KS(R4D, R4ND, B41_MY, &
8116 FI4, PSI4, fl4, D2N, &
8117 ISYM4, 1, 4, TPN, IDROP, FR_LIM, FRH_LIM, ICEMAX, NKR, COL, 4, Iin, Jin ,Kin, Itimestep)
8119 ! IN CASE ISYM4.NE.0
8126 CALL JERDFUN_KS(R5D, R5ND, B51_MY, &
8127 FI5, PSI5, fl5, D2N, &
8128 ISYM5, 1, 5, TPN, IDROP, FR_LIM, FRH_LIM, ICEMAX, NKR, COL, 5, Iin, Jin ,Kin, Itimestep)
8129 ! IN CASE ISYM5.NE.0
8140 FI1R1=FI1_K*R1_K*R1_K
8141 RMASSLBB=RMASSLBB+FI1R1
8145 FI2R2=FI2_K*R2_K*R2_K
8146 RMASSIBB=RMASSIBB+FI2R2
8154 FI3R3=FI3_K*R3_K*R3_K
8155 FI4R4=FI4_K*R4_K*R4_K
8156 FI5R5=FI5_K*R5_K*R5_K
8157 RMASSIBB=RMASSIBB+FI3R3
8158 RMASSIBB=RMASSIBB+FI4R4
8159 RMASSIBB=RMASSIBB+FI5R5
8161 RMASSIBB=RMASSIBB*COL3*RORI
8162 IF(RMASSIBB.LT.0.0) RMASSIBB=0.0
8163 RMASSLBB=RMASSLBB*COL3*RORI
8164 IF(RMASSLBB.LT.0.0) RMASSLBB=0.0
8168 FI1R1=FI1_K*R1_K*R1_K
8169 RMASSLAA=RMASSLAA+FI1R1
8171 FI2(K,ICE)=PSI2(K,ICE)
8174 FI2R2=FI2_K*R2_K*R2_K
8175 RMASSIAA=RMASSIAA+FI2R2
8183 FI3R3=FI3_K*R3_K*R3_K
8184 FI4R4=FI4_K*R4_K*R4_K
8185 FI5R5=FI5_K*R5_K*R5_K
8186 RMASSIAA=RMASSIAA+FI3R3
8187 RMASSIAA=RMASSIAA+FI4R4
8188 RMASSIAA=RMASSIAA+FI5R5
8190 RMASSIAA=RMASSIAA*COL3*RORI
8191 IF(RMASSIAA.LE.0.0) RMASSIAA=0.0
8192 RMASSLAA=RMASSLAA*COL3*RORI
8193 IF(RMASSLAA.LT.0.0) RMASSLAA=0.0
8195 DELMASSL1=RMASSLAA-RMASSLBB
8196 DELMASSI1=RMASSIAA-RMASSIBB
8197 DELTAQ1=DELMASSL1+DELMASSI1
8201 TPN = TPS + DAL1*DELMASSL1+DAL2*DELMASSI1
8203 IF(ABS(DAL1*DELMASSL1+DAL2*DELMASSI1) > 5.0 )THEN
8204 print*,"ONECOND3-input-start"
8205 print*,"TTinput",TTinput,"QQinput",QQinput,"PP",PP
8206 print*,'DEL1Ninput',DEL1Ninput,'DEL2Ninput',DEL2Ninput
8207 print*,"ROR",ROR,'VR1',VR1,'PSINGLE',PSINGLE
8208 print*,'DIV1',DIV1,'DIV2',DIV2
8209 print*,'R1',R1,'RLEC',RLEC,'RO1BL',RO1BL
8210 print*,'const',AA1_MY,BB1_MY,AA2_MY,BB2_MY
8211 print*,'const',C1_MEY,C2_MEY,COL
8212 print*,'DTCOND',DTCOND,'ICEMAX',ICEMAX,'NKR',NKR
8213 print*,'ISYM1',ISYM1,'ISYM2',ISYM2,'ISYM3',ISYM3,'ISYM4',ISYM4,'ISYM5',ISYM5
8214 print*,Iin,Jin,Kin,W_in,DX_in
8215 print*,"ONECOND3-input-end"
8217 print*,"ONECOND3-out (start)"
8218 print*,"I=",Iin,"J=",Jin,"Kin",Kin,"W",w_in,"DX",dx_in
8219 print*,"DEL1N,DEL2N,D1N,D2N,RW,PW,RI,PI,DT"
8220 print*,DEL1N,DEL2N,D1N,D2N,RW,PW,RI,PI,DTT
8221 print*,"TPS=",TPS,"TPN=",TPN,"QPS=",QPS,"delmassl1",delmassl1,"delmassi1",delmassi1
8222 print*,"DAL2=",DAL2,"DAL1=",DAL1
8223 print*,RMASSLAA,RMASSLBB
8224 print*,RMASSIAA,RMASSIBB
8230 print*,"R1D",R1D,"R1ND",R1ND
8232 print*,"R3D",R3D,"R3ND",R3ND
8234 print*,"R4D",R4D,"R4ND",R4ND
8236 print*,"R5D",R5D,"R5ND",R5ND
8237 print*,"ONECOND3-out (end)"
8238 IF(ABS(DAL1*DELMASSL1+DAL2*DELMASSI1) > 5.0 )THEN
8239 call wrf_error_fatal("fatal error in ONECOND3-out (ABS(DAL1*DELMASSL1+DAL2*DELMASSI1) > 5.0), model stop")
8243 ! END OF TIME SPLITTING
8245 IF(TIMENEW < DT) GOTO 16
8253 FF2(KR,ICE)=PSI2(KR,ICE)
8261 END SUBROUTINE ONECOND3
8262 ! +---------------------------------------------------------+
8263 SUBROUTINE COAL_BOTT_NEW(FF1R,FF2R,FF3R, &
8264 FF4R,FF5R,TT,QQ,PP,RHO,dt_coll,TCRIT,TTCOAL,&
8265 FLIQFR_S,FLIQFR_G,FLIQFR_H,FRIMFR_S, &
8267 Iin,Jin,Kin,itimestep,CollEff)
8269 use module_mp_SBM_Collision,only:coll_xyy_lwf,coll_xyx_lwf,coll_xxx_lwf, &
8270 coll_xyz_lwf, modkrn_KS, coll_breakup_KS, &
8275 integer,intent(in) :: Iin,Jin,Kin,itimestep
8276 real(kind=r4size),intent(in) :: tcrit,ttcoal,dt_coll
8277 real(kind=r4size),intent(inout) :: ff1r(:),ff2r(:,:),ff3r(:),ff4r(:), &
8279 real(kind=r8size),intent(inout) :: fliqfr_s(:),fliqfr_g(:),fliqfr_h(:), &
8280 frimfr_s(:),del1in,del2in,tt,qq
8281 real(kind=r8size),intent(in) :: pp
8283 integer :: KR,ICE,icol_drop,icol_snow,icol_graupel,icol_hail, &
8284 icol_column,icol_plate,icol_dendrite,icol_drop_brk
8285 real(kind=r8size) :: g1(nkr),g2(nkr,icemax),g3(nkr),g4(nkr),g5(nkr), &
8286 gdumb(JMAX),gdumb_bf_breakup(JMAX),xl_dumb(JMAX), &
8287 g_orig(nkr),g2_1(nkr),g2_2(nkr),g2_3(nkr)
8288 real(kind=r4size) :: cont_fin_drop,dconc,conc_icempl,deldrop,t_new, &
8289 delt_new,cont_fin_ice,conc_old,conc_new,cont_init_ice, &
8290 cont_init_drop,ALWC,T_new_real,PP_r,rho,ES1N,ES2N,EW1N
8291 real(kind=r4size),parameter :: tt_no_coll=273.16
8293 integer :: I,J,IT,NDIV
8294 real(kind=r8size) :: break_drop_bef,break_drop_aft,dtbreakup,break_drop_per, &
8295 prdkrn,fl1(nkr),rf1(nkr),rf3(nkr),fl3(nkr), &
8296 fl4(nkr),fl5(nkr),fl2_1(nkr),fl2_2(nkr),fl2_3(nkr), &
8297 rf2(nkr),rf4(nkr),rf5(nkr),conc_drop_old, conc_drop_new, &
8298 dconc_drop, dm_rime(nkr), conc_plate_icempl, &
8299 col3, cont_coll_drop
8300 real(kind=r8size),parameter :: prdkrn1 = 1.0d0
8301 real(kind=r4size),parameter :: prdkrn1_r = 1.0
8302 integer,parameter :: icempl = 1
8303 real(kind=r8size),parameter :: t_ice_mpl = 270.15D0 ! for ice multiplication in temp > 268.15
8304 real(kind=r8size),PARAMETER :: g_lim = 1.0D-19*1.0D3,AA1_MY = 2.53E12, &
8305 BB1_MY = 5.42E3, AA2_MY = 3.41E13 ,BB2_MY = 6.13E3
8318 call Kernals_KS(dt_coll,nkr,PP_r)
8319 !CALL MODKRN_KS(TT,QQ,PP,RHO,PRDKRN,TTCOAL,1,1,Iin,Jin,Kin)
8320 CALL MODKRN_KS(TT,QQ,PP,RHO,PRDKRN,TTCOAL,11,1,Iin,Jin,Kin)
8325 G1(KR)=FF1R(KR)*3.*XL(KR)*XL(KR)*1.E3
8326 G2(KR,1)=FF2R(KR,1)*3*xi(KR,1)*XI(KR,1)*1.e3
8327 G2(KR,2)=FF2R(KR,2)*3.*xi(KR,2)*XI(KR,2)*1.e3
8328 G2(KR,3)=FF2R(KR,3)*3.*xi(KR,3)*XI(KR,3)*1.e3
8329 G3(KR)=FF3R(KR)*3.*xs(kr)*xs(kr)*1.e3
8330 G4(KR)=FF4R(KR)*3.*xg(kr)*xg(kr)*1.e3
8331 G5(KR)=FF5R(KR)*3.*xh(kr)*xh(kr)*1.e3
8335 if(kr .gt. KRMIN_BREAKUP .and. g1(kr) > g_lim) icol_drop_brk = 1
8336 IF (IBREAKUP.NE.1) icol_drop_brk = 0
8337 if(g1(kr).gt.g_lim) icol_drop=1
8338 if(g2_1(kr).gt.g_lim) icol_column = 1
8339 if(g2_2(kr).gt.g_lim) icol_plate = 1
8340 if(g2_3(kr).gt.g_lim) icol_dendrite = 1
8341 if(g3(kr).gt.g_lim) icol_snow = 1
8342 if(g4(kr).gt.g_lim) icol_graupel = 1
8343 if(g5(kr).gt.g_lim) icol_hail = 1
8347 fl3(:) = FLIQFR_S(:)
8348 fl4(:) = FLIQFR_G(:)
8349 fl5(:) = FLIQFR_H(:)
8351 rf3(:) = FRIMFR_S(:)
8356 ! calculation of initial hydromteors content in g/cm**3 :
8357 cont_init_drop = 0.0
8359 cont_init_drop = sum(g1(1:nkr))
8360 cont_init_ice = sum(g3(1:nkr)) + sum(g4(1:nkr)) + sum(g5(1:nkr))
8362 cont_init_ice = cont_init_ice + sum(g2(1:nkr,ice))
8364 cont_init_drop=col*cont_init_drop*1.e-3
8365 cont_init_ice=col*cont_init_ice*1.e-3
8366 ! calculation of alwc in g/m**3
8367 alwc=cont_init_drop*1.e6
8368 ! calculation interactions :
8369 ! droplets - droplets and droplets - ice :
8370 ! water-water = water
8372 if (icol_drop.eq.1)then
8373 ! ... Drop-Drop collisions
8375 call coll_xxx_lwf (G1,fl1,CWLL,XL_MG,CHUCM,IMA,1.d0,NKR)
8377 if(icol_drop_brk == 1)then
8381 dtbreakup = dt_coll/ndiv
8384 gdumb(kr)= g1(kr)*1.D-3
8385 gdumb_bf_breakup(kr) = g1(kr)*1.D-3
8386 xl_dumb(kr)=xl_mg(KR)*1.D-3
8390 break_drop_bef = break_drop_bef+g1(kr)*1.D-3
8394 call coll_breakup_KS(gdumb, xl_dumb, JMAX, dtbreakup, JBREAK, PKIJ, QKJ, NKR, NKR)
8398 FF1R(KR) = (1.0d3*GDUMB(KR))/(3.0*XL(KR)*XL(KR)*1.E3)
8399 if(FF1R(KR) < 0.0)then
8404 !print*,"noBreakUp",Iin,Jin,Kin,Itimestep,ndiv
8406 !call wrf_error_fatal("in coal_bott af-coll_breakup - FF1R/GDUMB < 0.0")
8409 if(FF1R(kr) .ne. FF1R(kr)) then
8410 print*,kr,GDUMB(kr),GDUMB_BF_BREAKUP(kr),XL(kr)
8411 print*,IT,NDIV, DTBREAKUP
8413 print*,GDUMB_BF_BREAKUP
8414 call wrf_error_fatal("in coal_bott af-coll_breakup - FF1R NaN, model stop")
8418 break_drop_aft=0.0d0
8420 break_drop_aft=break_drop_aft+gdumb(kr)
8422 break_drop_per=break_drop_aft/break_drop_bef
8423 if (break_drop_per > 1.001)then
8428 g1(kr) = gdumb(kr)*1.D3
8431 ! if icol_drop_brk.eq.1
8437 ! +--------------------------------------------------------+
8438 ! Negative temperature collisions block (start)
8439 ! +---------------------------------------------------------+
8440 if(tt <= 273.15)then
8441 if(icol_drop == 1)then
8442 ! ... interactions between drops and snow
8443 ! drop - snow = graupel/hail
8444 ! snow - drop = snow
8446 ! snow - drop = graupel/hail
8447 if (icol_snow == 1)then
8451 if(hail_opt == 1)then
8452 call coll_xyz_lwf(g1,g3,g5,rf1,rf3,rf5,cwls,xl_mg,xs_mg, &
8453 chucm,ima,prdkrn1,nkr,0)
8455 call coll_xyz_lwf(g1,g3,g4,rf1,rf3,rf4,cwls,xl_mg,xs_mg, &
8456 chucm,ima,prdkrn1,nkr,0)
8461 if(alwc < alcr) then
8462 call coll_xyx_lwf(g3,g1,rf3,rf1,cwsl,xs_mg,xl_mg, &
8463 chucm,ima,prdkrn1,nkr,1,dm_rime)
8465 if(hail_opt == 1)then
8466 call coll_xyz_lwf(g3,g1,g5,rf3,rf1,rf5,cwsl,xs_mg,xl_mg, &
8467 chucm,ima,prdkrn1,nkr,1)
8469 call coll_xyz_lwf(g3,g1,g4,rf3,rf1,rf4,cwsl,xs_mg,xl_mg, &
8470 chucm,ima,prdkrn1,nkr,1)
8473 ! in case : icolxz_snow.ne.0
8476 if (icol_graupel == 1) then
8477 ! ... interactions between drops and graupel
8478 ! drops - graupel = graupel
8479 ! graupel - drops = graupel
8480 ! drops - graupel = hail (no transition in FSBM)
8481 ! graupel - drop = hail (no transition in FSBM)
8482 if(alwc < alcr_g) then
8485 call coll_xyy_lwf(g1,g4,rf1,rf4,cwlg,xl_mg,xg_mg, &
8486 chucm,ima,prdkrn1,nkr,0)
8487 ! ... for ice multiplication
8490 do kr = kr_icempl,nkr
8491 conc_old = conc_old+col*g1(kr)/xl_mg(kr)
8495 call coll_xyx_lwf(g4,g1,rf4,rf1,cwgl,xg_mg,xl_mg, &
8496 chucm,ima,prdkrn1,nkr,1,dm_rime)
8501 call coll_xyz_lwf(g1,g4,g5,rf1,rf4,rf5,cwlg,xl_mg,xg_mg, &
8502 chucm,ima,prdkrn1,nkr,1)
8503 ! ... for ice multiplication
8506 do kr = kr_icempl,nkr
8507 conc_old = conc_old+col*g1(kr)/xl_mg(kr)
8512 call coll_xyz_lwf(g4,g1,g5,rf4,rf1,rf5,cwgl,xg_mg,xl_mg, &
8513 chucm,ima,prdkrn1,nkr,1)
8515 ! in case icol_graup == 1
8518 if(icol_hail == 1) then
8519 ! interactions between drops and hail
8520 ! drops - hail = hail
8521 ! hail - water = hail
8524 call coll_xyy_lwf(g1,g5,rf1,rf5,cwlh,xl_mg,xh_mg, &
8525 chucm,ima,prdkrn1,nkr,0)
8526 ! ... for ice multiplication
8529 do kr = kr_icempl,nkr
8530 conc_old = conc_old+col*g1(kr)/xl_mg(kr)
8534 call coll_xyx_lwf(g5,g1,rf5,rf1,cwhl,xh_mg,xl_mg, &
8535 chucm,ima,prdkrn1,nkr,1,dm_rime)
8536 ! in case icol_hail == 1
8539 if((icol_graupel == 1 .or. icol_hail == 1) .and. icempl == 1) then
8540 if(tt .ge. 265.15 .and. tt .le. tcrit) then
8541 ! ... ice-multiplication (H-M) :
8542 do kr = kr_icempl,nkr
8543 conc_new=conc_new+col*g1(kr)/xl_mg(kr)
8545 dconc = conc_old-conc_new
8546 if(tt .le. 268.15) then
8547 conc_icempl=dconc*4.e-3*(265.15-tt)/(265.15-268.15)
8549 if(tt .gt. 268.15) then
8550 conc_icempl=dconc*4.e-3*(tcrit-tt)/(tcrit-268.15)
8552 !g2_2(1)=g2_2(1)+conc_icempl*xi2_mg(1)/col
8553 g3(1)=g3(1)+conc_icempl*xs_mg(1)/col ! [KSS] >> FAST-sbm has small snow as IC
8554 ! in case t.ge.265.15 :
8561 if(icol_snow == 1) then
8562 ! ... interactions between snowflakes
8563 call coll_xxx_lwf(g3,rf3,cwss,xs_mg,chucm,ima,prdkrn,nkr)
8564 ! in case icolxz_snow.ne.0
8567 ! in case : t > TTCOAL
8568 endif ! if tt <= 273.15
8569 ! Negative temp. collision block (end)
8570 ! +-----------------------------------------------+
8578 cont_fin_drop=cont_fin_drop+g1(kr)
8579 cont_fin_ice=cont_fin_ice+g3(kr)+g4(kr)+g5(kr)
8581 cont_fin_ice=cont_fin_ice+g2(kr,ice)
8584 cont_fin_drop=col*cont_fin_drop*1.e-3
8585 cont_fin_ice=col*cont_fin_ice*1.e-3
8586 deldrop=cont_init_drop-cont_fin_drop ! [g/cm**3]
8587 ! riming temperature correction (rho in g/cm**3) :
8588 if(t_new <= 273.15) then
8589 if(deldrop > 0.0) then
8590 t_new = t_new + 320.*deldrop/rho
8591 ES1N = POLYSVP(t_new,0)
8592 ES2N = POLYSVP(t_new,1)
8593 EW1N = QQ*PP/(0.622+0.378*QQ)
8594 DEL1in = EW1N/ES1N - 1.0
8595 DEL2in = EW1N/ES2N - 1.0
8598 if(abs(deldrop).gt.cont_init_drop*0.05) then
8599 call wrf_error_fatal("fatal error in module_mp_fast_sbm (abs(deldrop).gt.cont_init_drop), model stop")
8605 ! recalculation of density function f1,f3,f4,f5 in units [1/(g*cm**3)] :
8607 FF1R(KR)=G1(KR)/(3.*XL(KR)*XL(KR)*1.E3)
8608 if((FF1R(kr) .ne. FF1R(kr)) .or. FF1R(kr) < 0.0)then
8610 call wrf_error_fatal("stop at end coal_bott - FF1R NaN or FF1R < 0.0, model stop")
8612 FF3R(KR)=G3(KR)/(3.*xs(kr)*xs(kr)*1.e3)
8613 if((FF3R(kr) .ne. FF3R(kr)) .or. FF3R(kr) < 0.0)then
8614 call wrf_error_fatal("stop at end coal_bott - FF3R NaN or FF3R < 0.0, model stop")
8616 if(hail_opt == 0)then
8617 FF4R(KR)=G4(KR)/(3.*xg(kr)*xg(kr)*1.e3)
8618 if((FF4R(kr) .ne. FF4R(kr)) .or. FF4R(kr) < 0.0) then
8619 call wrf_error_fatal("stop at end coal_bott - FF4R NaN or FF4R < 0.0, model stop")
8622 FF5R(KR)=G5(KR)/(3.*xh(kr)*xh(kr)*1.e3)
8623 if((FF5R(kr) .ne. FF5R(kr)) .or. FF5R(kr) < 0.0) then
8624 call wrf_error_fatal("stop at end coal_bott - FF5R NaN or FF5R < 0.0, model stop")
8630 FLIQFR_S(:) = fl3(:)
8631 FLIQFR_G(:) = fl4(:)
8632 FLIQFR_H(:) = fl5(:)
8633 FRIMFR_S(:) = rf3(:)
8635 if (abs(tt-t_new).gt.5.0) then
8636 call wrf_error_fatal("fatal error in module_mp_FAST_sbm Del_T 5 K, model stop")
8642 END SUBROUTINE COAL_BOTT_NEW
8643 ! ..................................................................................................
8644 SUBROUTINE BREAKINIT_KS(PKIJ,QKJ,ECOALMASSM,BRKWEIGHT,XL_r,DROPRADII,BR_MAX,JBREAK,JMAX,NKR,VR1)
8652 integer,intent(in) :: br_max, JBREAK, NKR, JMAX
8653 real(kind=r8size),intent(inout) :: ECOALMASSM(:,:),BRKWEIGHT(:)
8654 real,intent(in) :: XL_r(:), DROPRADII(:), VR1(:)
8655 real(kind=r4size),intent(inout) :: PKIJ(:,:,:),QKJ(:,:)
8658 !REAL :: XL_r(size(NKR))
8659 INTEGER :: hujisbm_unit1
8660 LOGICAL, PARAMETER :: PRINT_diag=.FALSE.
8662 LOGICAL , EXTERNAL :: wrf_dm_on_monitor
8663 CHARACTER*80 errmess
8665 !.....INPUT VARIABLES
8667 ! GT : MASS DISTRIBUTION FUNCTION
8668 ! XT_MG : MASS OF BIN IN MG
8669 ! JMAX : NUMBER OF BINS
8671 !.....LOCAL VARIABLES
8673 DOUBLE PRECISION :: XL_d(NKR), DROPRADII_d(NKR), VR1_d(NKR)
8675 INTEGER,PARAMETER :: AP = 1
8676 INTEGER :: I,J,K,JDIFF
8677 REAL :: RPKIJ(JBREAK,JBREAK,JBREAK),RQKJ(JBREAK,JBREAK)
8679 DOUBLE PRECISION :: M(0:JBREAK),ALM
8680 REAL :: DBREAK(JBREAK),GAIN,LOSS
8682 !.....DECLARATIONS FOR INIT
8683 INTEGER :: IP,KP,JP,KQ,JQ
8686 CHARACTER*256 FILENAME_P,FILENAME_Q, file_p, file_q
8694 if(nkr == 43) file_p = 'SBM_input_43/'//'coeff_p43.dat'
8695 if(nkr == 43) file_q = 'SBM_input_43/'//'coeff_q43.dat'
8696 if(nkr == 33) file_p = 'SBM_input_33/'//'coeff_p_new_33.dat' ! new Version 33 (taken from 43bins)
8697 if(nkr == 33) file_q = 'SBM_input_33/'//'coeff_q_new_33.dat' ! new Version 33 (taken from 43 bins)
8700 IF ( wrf_dm_on_monitor() ) THEN
8702 INQUIRE ( i , OPENED = opened )
8703 IF ( .NOT. opened ) THEN
8711 CALL wrf_dm_bcast_bytes ( hujisbm_unit1 , IWORDSIZE )
8713 IF ( hujisbm_unit1 < 0 ) THEN
8714 CALL wrf_error_fatal ( 'Can not find unused fortran unit to read in BREAKINIT_KS lookup table, model stop' )
8717 IF ( wrf_dm_on_monitor() ) THEN
8718 OPEN(UNIT=hujisbm_unit1,FILE=trim(file_p), &
8719 !OPEN(UNIT=hujisbm_unit1,FILE="coeff_p.asc", &
8720 FORM="FORMATTED",STATUS="OLD",ERR=2070)
8725 READ(hujisbm_unit1,'(3I6,1E16.8)') KP,IP,JP,PKIJ(KP,IP,JP) ! PKIJ=[g^3*cm^3/s]
8729 CLOSE(hujisbm_unit1)
8733 IF ( wrf_dm_on_monitor() ) THEN
8735 INQUIRE ( i , OPENED = opened )
8736 IF ( .NOT. opened ) THEN
8744 CALL wrf_dm_bcast_bytes ( hujisbm_unit1 , IWORDSIZE )
8746 IF ( hujisbm_unit1 < 0 ) THEN
8747 CALL wrf_error_fatal ( 'Can not find unused fortran unit to read in BREAKINIT_KS lookup table, model stop' )
8750 IF ( wrf_dm_on_monitor() ) THEN
8751 OPEN(UNIT=hujisbm_unit1,FILE=trim(file_q), &
8752 FORM="FORMATTED",STATUS="OLD",ERR=2070)
8755 READ(hujisbm_unit1,'(2I6,1E16.8)') KQ,JQ,QKJ(KQ,JQ)
8758 CLOSE(hujisbm_unit1)
8761 DROPRADII_d = DROPRADII
8765 ECOALMASSM(I,J)=ECOALMASS(xl_d(I), xl_d(J), DROPRADII_d, vr1_d, NKR)
8768 ! Correction of coalescence efficiencies for drop collision kernels
8771 ECOALMASSM(NKR,J)=0.1D-29
8776 WRITE( errmess , '(A,I4)' ) &
8777 'module_FAST_SBM: error opening hujisbm_DATA on unit, model stop' &
8779 CALL wrf_error_fatal(errmess)
8780 END SUBROUTINE BREAKINIT_KS
8782 !coalescence efficiency as function of masses
8783 !----------------------------------------------------------------------------+
8784 double precision FUNCTION ecoalmass(x1, x2, DROPRADII, VR1_BREAKUP, NKR)
8787 integer,intent(in) :: NKR
8788 real(kind=r8size),intent(in) :: DROPRADII(NKR), VR1_BREAKUP(NKR), x1, x2
8790 real(kind=r8size),PARAMETER :: zero=0.0d0,one=1.0d0,eps=1.0d-10
8791 real(kind=r8size) :: rho, PI, akPI, Deta, Dksi
8793 rho=1.0d0 ! [rho]=g/cm^3
8798 Deta = (akPI*x1/rho)**(1.0d0/3.0d0)
8799 Dksi = (akPI*x2/rho)**(1.0d0/3.0d0)
8801 ecoalmass = ecoaldiam(Deta, Dksi, DROPRADII, VR1_BREAKUP, NKR)
8804 END FUNCTION ecoalmass
8805 !coalescence efficiency as function of diameters
8806 !---------------------------------------------------------------------------+
8807 double precision FUNCTION ecoaldiam(Deta,Dksi,DROPRADII,VR1_BREAKUP,NKR)
8810 integer,intent(in) :: NKR
8811 real(kind=r8size),intent(in) :: DROPRADII(nkr), VR1_BREAKUP(nkr),Deta,Dksi
8813 real(kind=r8size) :: Dgr, Dkl, Rgr, RKl, q, qmin, qmax, e, x, e1, e2, sin1, cos1
8814 real(kind=r8size),PARAMETER :: zero=0.0d0,one=1.0d0,eps=1.0d-30,PI=3.1415927d0
8816 Dgr=dmax1(Deta,Dksi)
8817 Dkl=dmin1(Deta,Dksi)
8827 if(Dkl<100.0d-4) then
8831 elseif (q<qmin) then
8833 e = ecoalOchs(Dgr,Dkl,DROPRADII, VR1_BREAKUP, NKR)
8835 elseif(q>=qmin.and.q<qmax) then
8837 x=(q-qmin)/(qmax-qmin)
8839 sin1=dsin(PI/2.0d0*x)
8840 cos1=dcos(PI/2.0d0*x)
8842 e1=ecoalOchs(Dgr, Dkl, DROPRADII, VR1_BREAKUP, NKR)
8843 e2=ecoalLowList(Dgr, Dkl, DROPRADII, VR1_BREAKUP, NKR)
8845 e=cos1**2*e1+sin1**2*e2
8847 elseif(q>=qmax) then
8849 e=ecoalLowList(Dgr, Dkl, DROPRADII, VR1_BREAKUP, NKR)
8857 ecoaldiam=dmax1(dmin1(one,e),eps)
8860 END FUNCTION ecoaldiam
8861 !coalescence efficiency (Low & List)
8862 !----------------------------------------------------------------------------+
8863 double precision FUNCTION ecoalLowList(Dgr,Dkl,DROPRADII,VR1_BREAKUP,NKR)
8867 integer,intent(in) :: NKR
8868 real(kind=r8size),intent(in) :: DROPRADII(NKR), VR1_BREAKUP(NKR)
8869 real(kind=r8size),intent(inout) :: Dgr, Dkl
8871 real(kind=r8size) :: sigma, aka, akb, dSTSc, ST, Sc, ET, CKE, qq0, qq1, qq2, Ecl, W1, W2, DC
8872 real(kind=r8size),PARAMETER :: epsi=1.d-20
8874 ! 1 J = 10^7 g cm^2/s^2
8876 sigma=72.8d0 ! Surface Tension,[sigma]=g/s^2 (7.28E-2 N/m)
8877 aka=0.778d0 ! Empirical Constant
8878 akb=2.61d-4 ! Empirical Constant,[b]=2.61E6 m^2/J^2
8880 CALL collenergy(Dgr,Dkl,CKE,ST,Sc,W1,W2,Dc,DROPRADII,VR1_BREAKUP,NKR)
8882 dSTSc=ST-Sc ! Diff. of Surf. Energies [dSTSc] = g*cm^2/s^2
8883 ET=CKE+dSTSc ! Coal. Energy, [ET] = "
8885 IF(ET<50.0d0) THEN ! ET < 5 uJ (= 50 g*cm^2/s^2)
8889 qq2=akb*sigma*(ET**2)/(Sc+epsi)
8892 !if(i_breakup==24.and.j_breakup==25) then
8893 !print*, 'IF(ET<50.0d0) THEN'
8894 !print*, 'Ecl=qq1*dexp(-qq2)'
8895 !print*, 'qq1,qq2,Ecl'
8896 !print*, qq1,qq2,Ecl
8908 END FUNCTION ecoalLowList
8910 !coalescence efficiency (Beard and Ochs)
8911 !---------------------------------------------------------------------------+
8912 double precision FUNCTION ecoalOchs(D_l,D_s,DROPRADII, VR1_BREAKUP,NKR)
8916 integer,intent(in) :: NKR
8917 real(kind=r8size),intent(in) :: DROPRADII(NKR), VR1_BREAKUP(NKR), D_l, D_s
8919 real(kind=r8size) :: PI, sigma, R_s, R_l, p, vTl, vTs, dv, Weber_number, pa1, pa2, pa3, g, x, e
8920 real(kind=r8size),PARAMETER :: epsf=1.d-30 , FPMIN=1.d-30
8923 sigma=72.8d0 ! Surface Tension [sigma] = g/s^2 (7.28E-2 N/m)
8924 ! Alles in CGS (1 J = 10^7 g cm^2/s^2)
8929 vTl=vTBeard(D_l,DROPRADII, VR1_BREAKUP,NKR)
8931 vTs=vTBeard(D_s,DROPRADII, VR1_BREAKUP,NKR)
8935 if(dv<FPMIN) dv=FPMIN
8937 Weber_number=R_s*dv**2/sigma
8943 g=2**(3.0d0/2.0d0)/(6.0d0*PI)*p**4*pa1/(pa2*pa3)
8944 x=Weber_number**(0.5d0)*g
8951 END FUNCTION ecoalOchs
8953 !Calculating the Collision Energy
8954 !------------------------------------------------------------------------------+
8955 SUBROUTINE COLLENERGY(Dgr,Dkl,CKE,ST,Sc,W1,W2,Dc,DROPRADII,VR1_BREAKUP,NKR)
8959 integer,intent(in) :: NKR
8960 real(kind=r8size),intent(in) :: DROPRADII(NKR), VR1_BREAKUP(NKR)
8961 real(kind=r8size),intent(inout) :: Dgr, Dkl, CKE, ST, Sc, W1, W2, Dc
8963 real(kind=r8size) :: PI, rho, sigma, ak10, Dgka2, Dgka3, v1, v2, dv, Dgkb3
8964 real(kind=r8size),PARAMETER :: epsf = 1.d-30, FPMIN = 1.d-30
8969 rho=1.0d0 ! Water Density,[rho]=g/cm^3
8970 sigma=72.8d0 ! Surf. Tension,(H2O,20C)=7.28d-2 N/m
8977 Dgka2=(Dgr**2)+(Dkl**2)
8979 Dgka3=(Dgr**3)+(Dkl**3)
8983 v1=vTBeard(Dgr,DROPRADII, VR1_BREAKUP,NKR)
8984 v2=vTBeard(Dkl,DROPRADII, VR1_BREAKUP,NKR)
8986 if(dv<FPMIN) dv=FPMIN
8988 if(dv<FPMIN) dv=FPMIN
8989 Dgkb3=(Dgr**3)*(Dkl**3)
8990 CKE=ak10*dv*Dgkb3/Dgka3 ! Collision Energy [CKE]=g*cm^2/s^2
8992 !if(i_breakup==24.and.j_breakup==25) then
8995 !print*, 'Dgkb3,Dgka2,Dgka3,ak10'
8996 !print*, Dgkb3,Dgka2,Dgka3,ak10
8997 !print*, 'v1,v2,dv,CKE'
8998 !print*, v1,v2,dv,CKE
9007 ST=PI*sigma*Dgka2 ! Surf.Energy (Parent Drop)
9008 Sc=PI*sigma*Dgka3**(2.0d0/3.0d0) ! Surf.Energy (coal.System)
9010 W1=CKE/(Sc+epsf) ! Weber Number 1
9011 W2=CKE/(ST+epsf) ! Weber Number 2
9013 Dc=Dgka3**(1.0d0/3.0d0) ! Diam. of coal. System
9015 !if(i_breakup==24.and.j_breakup==25) then
9016 !print*, 'ST,Sc,W1,W2,dc'
9017 !print*, ST,Sc,W1,W2,dc
9021 END SUBROUTINE COLLENERGY
9023 !Calculating Terminal Velocity (Beard-Formula)
9024 !------------------------------------------------------------------------+
9025 ! new change 23.07.07 (start)
9026 double precision FUNCTION vTBeard(diam,DROPRADII, VR1_BREAKUP, NKR)
9030 integer,intent(in) :: NKR
9031 real(kind=r8size),intent(in) :: DROPRADII(NKR), VR1_BREAKUP(NKR), diam
9034 real(kind=r8size) :: aa
9036 aa = diam/2.0d0 ! Radius in cm
9038 IF(aa <= DROPRADII(1)) vTBeard=VR1_BREAKUP(1)
9039 IF(aa > DROPRADII(NKR)) vTBeard=VR1_BREAKUP(NKR)
9042 IF(aa>DROPRADII(KR).and.aa<=DROPRADII(KR+1)) then
9043 vTBeard=VR1_BREAKUP(KR+1)
9048 END FUNCTION vTBeard
9050 ! new change 23.07.07 (end)
9051 !........................................................................
9052 END MODULE module_mp_fast_sbm