SCALE-RM
scale_atmos_phy_mp_sn14.F90
Go to the documentation of this file.
1 !-------------------------------------------------------------------------------
48 !-------------------------------------------------------------------------------
49 
50 #include "scalelib.h"
52  !-----------------------------------------------------------------------------
53  !
54  !++ used modules
55  !
56  use scale_precision
57  use scale_io
58  use scale_prof
59 
60  use scale_const, only: &
61  grav => const_grav, &
62  pi => const_pi, &
63  undef8 => const_undef8, &
64  rdry => const_rdry, &
65  cpdry => const_cpdry, &
66  cvdry => const_cvdry, &
67  p00 => const_pre00, &
68  t00 => const_tem00, &
69  rvap => const_rvap, &
70  cpvap => const_cpvap, &
71  cvvap => const_cvvap, &
72  cl => const_cl, &
73  ci => const_ci, &
74  lhv => const_lhv00, &
75  lhf => const_lhf00, &
76  lhv0 => const_lhv0, &
77  lhf0 => const_lhf0, &
78  lhs0 => const_lhs0, &
79  lhv00 => const_lhv00, &
80  lhf00 => const_lhf00, &
81  psat0 => const_psat0, &
82  emelt => const_emelt, &
83  dwatr => const_dwatr, &
84  small => const_eps
85 
86  use scale_atmos_hydrometeor, only: &
87  n_hyd
88 
89  !-----------------------------------------------------------------------------
90  implicit none
91  private
92  !-----------------------------------------------------------------------------
93  !
94  !++ Public procedure
95  !
96  public :: atmos_phy_mp_sn14_setup
105 
106  !-----------------------------------------------------------------------------
107  !
108  !++ Public parameters & variables
109  !
110  integer, public, parameter :: qa_mp = 11
111 
112  integer, parameter, public :: atmos_phy_mp_sn14_ntracers = qa_mp
113  integer, parameter, public :: atmos_phy_mp_sn14_nwaters = 2
114  integer, parameter, public :: atmos_phy_mp_sn14_nices = 3
115  character(len=H_SHORT), parameter, public :: atmos_phy_mp_sn14_tracer_names(qa_mp) = (/ &
116  'QV', &
117  'QC', &
118  'QR', &
119  'QI', &
120  'QS', &
121  'QG', &
122  'NC', &
123  'NR', &
124  'NI', &
125  'NS', &
126  'NG' /)
127  character(len=H_MID) , parameter, public :: atmos_phy_mp_sn14_tracer_descriptions(qa_mp) = (/ &
128  'Ratio of Water Vapor mass to total mass (Specific humidity)', &
129  'Ratio of Cloud Water mass to total mass ', &
130  'Ratio of Rain Water mass to total mass ', &
131  'Ratio of Cloud Ice mass ratio to total mass ', &
132  'Ratio of Snow mass ratio to total mass ', &
133  'Ratio of Graupel mass ratio to total mass ', &
134  'Cloud Water Number Density ', &
135  'Rain Water Number Density ', &
136  'Cloud Ice Number Density ', &
137  'Snow Number Density ', &
138  'Graupel Number Density '/)
139  character(len=H_SHORT), parameter, public :: atmos_phy_mp_sn14_tracer_units(qa_mp) = (/ &
140  'kg/kg ', &
141  'kg/kg ', &
142  'kg/kg ', &
143  'kg/kg ', &
144  'kg/kg ', &
145  'kg/kg ', &
146  'num/kg', &
147  'num/kg', &
148  'num/kg', &
149  'num/kg', &
150  'num/kg' /)
151 
152  !-----------------------------------------------------------------------------
153  !
154  !++ Private procedure
155  !
156  private :: mp_sn14_init
157  private :: mp_sn14
158 
159  !-----------------------------------------------------------------------------
160  !
161  !++ Private parameters
162  !
163  integer, private, parameter :: i_qv = 1
164  integer, private, parameter :: i_qc = 2
165  integer, private, parameter :: i_qr = 3
166  integer, private, parameter :: i_qi = 4
167  integer, private, parameter :: i_qs = 5
168  integer, private, parameter :: i_qg = 6
169  integer, private, parameter :: i_nc = 7
170  integer, private, parameter :: i_nr = 8
171  integer, private, parameter :: i_ni = 9
172  integer, private, parameter :: i_ns = 10
173  integer, private, parameter :: i_ng = 11
174 
175  integer, private, parameter :: hydro_max = 5
176 
177  integer, private, parameter :: i_mp_qc = 1
178  integer, private, parameter :: i_mp_qr = 2
179  integer, private, parameter :: i_mp_qi = 3
180  integer, private, parameter :: i_mp_qs = 4
181  integer, private, parameter :: i_mp_qg = 5
182  integer, private, parameter :: i_mp_nc = 6
183  integer, private, parameter :: i_mp_nr = 7
184  integer, private, parameter :: i_mp_ni = 8
185  integer, private, parameter :: i_mp_ns = 9
186  integer, private, parameter :: i_mp_ng = 10
187 
188  ! production rate
189  ! nucleation
190  integer, parameter :: i_lcccn = 1
191  integer, parameter :: i_ncccn = 2
192  integer, parameter :: i_liccn = 3
193  integer, parameter :: i_niccn = 4
194  ! freezing
195  integer, parameter :: i_lchom = 5
196  integer, parameter :: i_nchom = 6
197  integer, parameter :: i_lchet = 7
198  integer, parameter :: i_nchet = 8
199  integer, parameter :: i_lrhet = 9
200  integer, parameter :: i_nrhet = 10
201  ! melting
202  integer, parameter :: i_limlt = 11
203  integer, parameter :: i_nimlt = 12
204  integer, parameter :: i_lsmlt = 13
205  integer, parameter :: i_nsmlt = 14
206  integer, parameter :: i_lgmlt = 15
207  integer, parameter :: i_ngmlt = 16
208  ! vapor deposition
209  integer, parameter :: i_lrdep = 17
210  integer, parameter :: i_nrdep = 18
211  integer, parameter :: i_lidep = 19
212  integer, parameter :: i_nidep = 20
213  integer, parameter :: i_lsdep = 21
214  integer, parameter :: i_nsdep = 22
215  integer, parameter :: i_lgdep = 23
216  integer, parameter :: i_ngdep = 24
217  integer, parameter :: i_lcdep = 25
218 ! integer, parameter :: I_NCdep = 26
219  ! warm collection process
220  ! auto-conversion
221  integer, parameter :: i_lcaut = 26
222  integer, parameter :: i_ncaut = 27
223  integer, parameter :: i_nraut = 28
224  ! accretion
225  integer, parameter :: i_lcacc = 29
226  integer, parameter :: i_ncacc = 30
227  ! self-colletion, break-up
228  integer, parameter :: i_nrslc = 31
229  integer, parameter :: i_nrbrk = 32
230 
231  ! partial conversion(ice, snow => graupel)
232  integer, parameter :: i_licon = 33
233  integer, parameter :: i_nicon = 34
234  integer, parameter :: i_lscon = 35
235  integer, parameter :: i_nscon = 36
236  ! enhanced melting due to
237  integer, parameter :: i_liacm = 37 ! ice-cloud
238  integer, parameter :: i_niacm = 38
239  integer, parameter :: i_liarm = 39 ! ice-rain
240  integer, parameter :: i_niarm = 40
241  integer, parameter :: i_lsacm = 41 ! snow-cloud
242  integer, parameter :: i_nsacm = 42
243  integer, parameter :: i_lsarm = 43 ! snow-rain
244  integer, parameter :: i_nsarm = 44
245  integer, parameter :: i_lgacm = 45 ! graupel-cloud
246  integer, parameter :: i_ngacm = 46
247  integer, parameter :: i_lgarm = 47 ! graupel-rain
248  integer, parameter :: i_ngarm = 48
249  ! ice multiplication by splintering
250  integer, parameter :: i_lgspl = 49
251  integer, parameter :: i_lsspl = 50
252  integer, parameter :: i_nispl = 51
253  integer, parameter :: i_lihom = 52
254  integer, parameter :: i_nihom = 53
255  ! for charge density
256  integer, parameter :: i_ngspl = 54
257  integer, parameter :: i_nsspl = 55
258 
259  integer, parameter :: pq_max = 55
260 
261 
262  ! production rate of mixed-phase collection process
263  ! PXXacYY2ZZ means XX collect YY produce ZZ
264  integer, parameter :: i_liaclc2li = 1 ! cloud-ice
265  integer, parameter :: i_niacnc2ni = 2
266  integer, parameter :: i_lsaclc2ls = 3 ! cloud-snow(cloud change)
267  integer, parameter :: i_nsacnc2ns = 4
268  integer, parameter :: i_lgaclc2lg = 5 ! cloud-graupel
269  integer, parameter :: i_ngacnc2ng = 6
270  integer, parameter :: i_lracli2lg_i = 7 ! rain-ice(ice change)
271  integer, parameter :: i_nracni2ng_i = 8
272  integer, parameter :: i_lracli2lg_r = 9 ! rain-ice(rain change)
273  integer, parameter :: i_nracni2ng_r = 10
274  integer, parameter :: i_lracls2lg_s = 11 ! rain-snow(snow change)
275  integer, parameter :: i_nracns2ng_s = 12
276  integer, parameter :: i_lracls2lg_r = 13 ! rain-snow(rain change)
277  integer, parameter :: i_nracns2ng_r = 14
278  integer, parameter :: i_lraclg2lg = 15 ! rain-graupel(rain change)
279  integer, parameter :: i_nracng2ng = 16
280  integer, parameter :: i_liacli2ls = 17 ! ice-ice
281  integer, parameter :: i_niacni2ns = 18
282  integer, parameter :: i_liacls2ls = 19 ! ice-snow(ice change)
283  integer, parameter :: i_niacns2ns = 20
284  integer, parameter :: i_nsacns2ns = 21 ! snow-snow
285  integer, parameter :: i_ngacng2ng = 22 ! graupel-graupel
286  integer, parameter :: i_lgacls2lg = 23 ! snow-graupel
287  integer, parameter :: i_ngacns2ng = 24
288  integer, parameter :: i_lraclg2lr = 25
289  integer, parameter :: i_nracng2nr = 26
290  integer, parameter :: i_liaclg2lg = 27
291  integer, parameter :: i_niacng2ng = 28
292  integer, parameter :: i_cgngacns2ng = 29
293  integer, parameter :: i_cgngacni2ng = 30
294 
295  integer, parameter :: pac_max = 30
296  integer, parameter :: pcrg_max = 30
297 
298 
299  integer, private, parameter :: w_nmax = pq_max + pac_max
300  character(len=H_SHORT), private :: w_name(w_nmax)
301 
302  data w_name / 'I_LCccn', &
303  'I_NCccn', &
304  'I_LIccn', &
305  'I_NIccn', &
306  'I_LChom', &
307  'I_NChom', &
308  'I_LChet', &
309  'I_NChet', &
310  'I_LRhet', &
311  'I_NRhet', & ! 10
312  'I_LImlt', &
313  'I_NImlt', &
314  'I_LSmlt', &
315  'I_NSmlt', &
316  'I_LGmlt', &
317  'I_NGmlt', &
318  'I_LRdep', &
319  'I_NRdep', &
320  'I_LIdep', &
321  'I_NIdep', & ! 20
322  'I_LSdep', &
323  'I_NSdep', &
324  'I_LGdep', &
325  'I_NGdep', &
326  'I_LCdep', &
327  'I_LCaut', &
328  'I_NCaut', &
329  'I_NRaut', &
330  'I_LCacc', &
331  'I_NCacc', & ! 30
332  'I_NRslc', &
333  'I_NRbrk', &
334  'I_LIcon', &
335  'I_NIcon', &
336  'I_LScon', &
337  'I_NScon', &
338  'I_LIacm', &
339  'I_NIacm', &
340  'I_LIarm', &
341  'I_NIarm', & ! 40
342  'I_LSacm', &
343  'I_NSacm', &
344  'I_LSarm', &
345  'I_NSarm', &
346  'I_LGacm', &
347  'I_NGacm', &
348  'I_LGarm', &
349  'I_NGarm', &
350  'I_LGspl', &
351  'I_LSspl', & ! 50
352  'I_NIspl', &
353  'I_LIhom', &
354  'I_NIhom', &
355  'I_NGspl', &
356  'I_NSspl', & ! PQ_MAX
357  'I_LIacLC2LI', &
358  'I_NIacNC2NI', &
359  'I_LSacLC2LS', &
360  'I_NSacNC2NS', &
361  'I_LGacLC2LG', &
362  'I_NGacNC2NG', &
363  'I_LRacLI2LG_I', &
364  'I_NRacNI2NG_I', &
365  'I_LRacLI2LG_R', &
366  'I_NRacNI2NG_R', & ! 10
367  'I_LRacLS2LG_S', &
368  'I_NRacNS2NG_S', &
369  'I_LRacLS2LG_R', &
370  'I_NRacNS2NG_R', &
371  'I_LRacLG2LG', &
372  'I_NRacNG2NG', &
373  'I_LIacLI2LS', &
374  'I_NIacNI2NS', &
375  'I_LIacLS2LS', &
376  'I_NIacNS2NS', & ! 20
377  'I_NSacNS2NS', &
378  'I_NGacNG2NG', &
379  'I_LGacLS2LG', &
380  'I_NGacNS2NG', &
381  'I_LRacLG2LR', &
382  'I_NRacNG2NR', &
383  'I_LIacLG2LG', &
384  'I_NIacNG2NG', &
385  'I_CGNGacNS2NG', &
386  'I_CGNGacNI2NG' / ! 30 Pac_MAX
387 
388  real(rp), private, allocatable :: w3d(:,:,:,:)
389  integer, private :: hist_id(w_nmax), hist_idx(w_nmax)
390  integer, private :: hist_max
391 
392 
393  real(rp), private, parameter :: rhow = 1000.0_rp ! typical density for warm particles [kg/m3]
394  real(rp), private, parameter :: rhof = 100.0_rp ! typical density for frozen particles [kg/m3]
395  real(rp), private, parameter :: rhog = 400.0_rp ! typical density for grapel particles [kg/m3]
396 
397  ! for all processes
398  ! SB06, Table 1.
399  real(rp), private, parameter :: xc_min = 4.20e-15_rp ! [kg] : min mass, D_min=2um
400  real(rp), private, parameter :: xr_min = 2.60e-10_rp ! [kg] : min mass, D_min=79um
401  real(rp), private, parameter :: xi_min = 3.382e-13_rp ! [kg] : min mass, D_min=10um
402  real(rp), private, parameter :: xs_min = 1.847e-12_rp ! [kg] : min mass, D_min=20um
403  real(rp), private, parameter :: xg_min = 1.230e-10_rp ! [kg] : min mass, D_min=100um
404  ! refer to Seifert(2002) (Dr. Thesis, Table.5.1)
405  real(rp), private, parameter :: xc_max = 2.6e-10_rp ! [kg] : max, D_max=79um
406  real(rp), private, parameter :: xr_max = 5.00e-6_rp ! [kg] : max, D_max=2mm
407  real(rp), private, parameter :: xi_max = 1.377e-6_rp ! [kg] : max, D_max=5mm
408  real(rp), private, parameter :: xs_max = 7.519e-6_rp ! [kg] : max, D_max=1cm
409  real(rp), private, parameter :: xg_max = 4.900e-5_rp ! [kg] : max, D_max=1cm
410  ! filter similar to Ikawa et al.(1991) sec.3.5
411  real(rp), private, parameter :: xmin_filter= xc_min
412  ! filter of effective radius(1 micron)
413  real(rp), private, parameter :: rmin_re= 1.e-6_rp
414  !
415  ! SB06(95),(96)
416  real(rp), private, parameter :: n0r_min= 2.5e+5_rp ! [m-4]: min intercept parameter of rain
417  real(rp), private, parameter :: n0r_max= 2.0e+7_rp ! [m-4]: max
418  real(rp), private, parameter :: lambdar_min= 1.e+3_rp ! [m-1]: min slope parameter of rain
419  real(rp), private, parameter :: lambdar_max= 1.e+4_rp ! [m-1]: max
420  ! empirical value from Meyers etal.(1991), 1[/liter] = 1.d3[/m3]
421  real(rp), private, parameter :: nc_min = 1.e+4_rp ! [m-3] empirical T.Mitsui
422  real(rp), private, parameter :: nr_min = 1.0_rp ! [m-3] 1/1000 [/liter]
423  real(rp), private, parameter :: ni_min = 1.0_rp ! [m-3]
424  real(rp), private, parameter :: ns_min = 1.e-4_rp ! [m-3]
425  real(rp), private, parameter :: ng_min = 1.e-4_rp ! [m-3]
426  ! empirical filter
427  real(rp), private, parameter :: lc_min = xc_min*nc_min
428  real(rp), private, parameter :: lr_min = xr_min*nr_min
429  real(rp), private, parameter :: li_min = xi_min*ni_min
430  real(rp), private, parameter :: ls_min = xs_min*ns_min
431  real(rp), private, parameter :: lg_min = xg_min*ng_min
432  !
433  real(rp), private, parameter :: x_sep = 2.6e-10_rp ! boundary mass between cloud and rain
434  !
435  real(rp), private, parameter :: tem_min=100.0_rp
436  real(rp), private, parameter :: rho_min=1.e-5_rp ! 3.e-3 is lower limit recognized in many experiments.
437  real(rp), private, parameter :: rhoi = 916.70_rp
438  !
439  integer, private, save :: ntmax_phase_change = 1
440  integer, private, save :: ntmax_collection = 1
441  !
442  !--- standard density
443  real(rp), private, parameter :: rho_0 = 1.280_rp
444  !--- max number of Nc( activatable aerosol number concentration )
445  real(rp), allocatable, private, save :: nc_uplim_d(:,:,:)
446  !
447  !--- thermal conductivity of air
448  real(rp), private, parameter :: ka0 = 2.428e-2_rp
449 
450  real(rp), private, parameter :: dka_dt = 7.47e-5_rp
451 
452  !====== Ka = Ka0 + temc*dKa_dT
453  !
454  !--- Dynamic viscosity
455  real(rp), private, parameter :: mua0 = 1.718e-5_rp
456 
457  real(rp), private, parameter :: dmua_dt = 5.28e-8_rp
458 
459  !====== mua = mua0 + temc*dmua_dT
460  !
461  real(rp), private, save :: xc_ccn = 1.e-12_rp ! [kg]
462  real(rp), private, save :: xi_ccn = 1.e-12_rp ! [kg] ! [move] 11/08/30 T.Mitsui
463  !
464  ! capacity of diffusional growth
465  ! ( dependent of their geometries )
466  real(rp), private, save :: cap(hydro_max)
467  !
468  ! constants for Diameter-Mass relation
469  ! D = a * x^b
470  real(rp), private, save :: a_m(hydro_max), log_a_m(hydro_max)
471  real(rp), private, save :: b_m(hydro_max)
472  !$acc declare create(a_m, log_a_m, b_m)
473 
474  ! constants for Terminal velocity-Mass relation
475  ! vt = alpha * x^beta * f
476  real(rp), private, save :: alpha_v(hydro_max,2), log_alpha_v(hydro_max,2)
477  real(rp), private, save :: beta_v(hydro_max,2), log_beta_v(hydro_max,2)
478  real(rp), private, save :: alpha_vn(hydro_max,2) !
479  real(rp), private, save :: beta_vn(hydro_max,2) !
480  real(rp), private, save :: gamma_v(hydro_max)
481  !$acc declare create(beta_v, beta_vn, gamma_v)
482 
483  ! Aerodynamical factor for correction of terminal velocity.(Heymsfield and Iaquinta, 2000)
484  ! vt(tem,pre) = vt0 * (pre/pre0)**a_pre0 * (tem/tem0)**a_tem0
485  real(rp), private, parameter :: pre0_vt = 300.e+2_rp ! 300hPa
486  real(rp), private, parameter :: tem0_vt = 233.0_rp ! -40degC
487  real(rp), private, parameter :: a_pre0_vt = -0.1780_rp
488  real(rp), private, parameter :: a_tem0_vt = -0.3940_rp
489  ! Parameters to determine Droplet Size Distribution
490  ! as a General Gamma Distribution
491  ! f(x) = A x^nu exp(-lambda x^mu )
492  ! for Marshall Palmer Distribution ( popular for rain )
493  ! mu=1/3, nu=-2/3
494  ! for Gamma Distribution ( popular for cloud )
495  ! mu=1
496  real(rp), private, save :: nu(hydro_max)
497  real(rp), private, save :: mu(hydro_max)
498  !$acc declare create(nu)
499 
500  ! Mitchell(1996), JAS, vol.53, No.12, pp.1710-1723
501  ! area = a_area*D^b_area
502  ! area = ax_area*x^bx_area
503  ! Auer and Veal(1970), JAS, vol.27, pp.919-pp.926
504  ! height = a_h*x^b_h( based on h=a_ar*D^b_ar, ar:aspect ratio)
505  real(rp), private, save :: a_area(hydro_max) !
506  real(rp), private, save :: b_area(hydro_max) !
507  real(rp), private, save :: ax_area(hydro_max) !
508  real(rp), private, save :: bx_area(hydro_max) !
509  ! parameters for radius of equivalent area
510  ! r_ea = a_rea*x**b_rea
511  real(rp), private, save :: a_rea(hydro_max) !
512  real(rp), private, save :: b_rea(hydro_max) !
513  real(rp), private, save :: a_rea2(hydro_max) !
514  real(rp), private, save :: b_rea2(hydro_max) !
515  real(rp), private, save :: a_rea3(hydro_max) !
516  real(rp), private, save :: b_rea3(hydro_max) !
517  !
518  real(rp), private, save :: a_d2vt(hydro_max) !
519  real(rp), private, save :: b_d2vt(hydro_max) !
520  ! coefficient of x^2 moment of DSD
521  ! Z = integral x*x*f(x) dx
522  ! = coef_m2*N*(L/N)^2
523  real(rp), private, save :: coef_m2(hydro_max)
524  ! radar reflectivity coefficient defined by diameter
525  real(rp), private, save :: coef_d6(hydro_max) !
526  ! volume coefficient defined by diameter
527  real(rp), private, save :: coef_d3(hydro_max) !
528  ! coefficient of weighted mean diameter
529  real(rp), private, save :: coef_d(hydro_max)
530  ! coefficient of weighted mean d*d*v
531  real(rp), private, save :: coef_d2v(hydro_max) !
532  ! coefficient of moment of d*d*v
533  real(rp), private, save :: coef_md2v(hydro_max) !
534  !
535  ! for effective radius(spherical particle)
536  real(rp), private, save :: coef_r2(hydro_max)
537  real(rp), private, save :: coef_r3(hydro_max)
538  real(rp), private, save :: coef_re(hydro_max)
539  ! for effective radius(hexagonal plate)
540  real(rp), private, save :: coef_rea2(hydro_max) !
541  real(rp), private, save :: coef_rea3(hydro_max) !
542  logical, private, save :: opt_m96_ice=.true. !
543  logical, private, save :: opt_m96_column_ice=.false. !
544  !
545  ! coefficeint of weighted mean terminal velocity
546  ! vt0 is number weighted and
547  ! vt1 is mass weighted.
548  real(rp), private, save :: coef_vt0(hydro_max,2), log_coef_vt0(hydro_max,2)
549  real(rp), private, save :: coef_vt1(hydro_max,2), log_coef_vt1(hydro_max,2)
550  real(rp), private, save :: coef_deplc
551  real(rp), private, save :: coef_dave_n(hydro_max), log_coef_dave_n(hydro_max)
552  real(rp), private, save :: coef_dave_l(hydro_max), log_coef_dave_l(hydro_max)
553  !$acc declare create(log_coef_vt0, log_coef_vt1)
554  !$acc declare create(log_coef_dave_N, log_coef_dave_L)
555 
556  ! diameter of terminal velocity branch
557  !
558  real(rp), private, save :: d0_ni=261.76e-6_rp, log_d0_ni
559  real(rp), private, save :: d0_li=398.54e-6_rp, log_d0_li
560  real(rp), private, parameter :: d0_ns=270.03e-6_rp, log_d0_ns = log(d0_ns)
561  real(rp), private, parameter :: d0_ls=397.47e-6_rp, log_d0_ls = log(d0_ls)
562  real(rp), private, parameter :: d0_ng=269.08e-6_rp, log_d0_ng = log(d0_ng)
563  real(rp), private, parameter :: d0_lg=376.36e-6_rp, log_d0_lg = log(d0_lg)
564  !$acc declare create(log_d0_ni, log_d0_li)
565 
566  !
567  real(rp), private, parameter :: coef_vtr_ar1=9.65_rp ! coef. for large branch
568  ! original parameter of Rogers etal.(1993)
569  real(rp), private, parameter :: coef_vtr_br1=10.43_rp ! ...
570  real(rp), private, parameter :: coef_vtr_cr1=600.0_rp ! ...
571  real(rp), private, parameter :: coef_vtr_ar2=4.e+3_rp ! coef. for small branch
572  real(rp), private, parameter :: coef_vtr_br2=12.e+3_rp ! ...
573  real(rp), private, parameter :: d_vtr_branch=0.745e-3_rp ! 0.745 mm (diameter dividing 2-branches)
574  ! equilibrium diameter of rain break-up
575  real(rp), private, parameter :: dr_eq = 1.10e-3_rp ! eqilibrium diameter, Seifert 2008(36)
576  ! coefficient of General Gamma.
577  ! f(x) = A x^nu exp(-lambda x^mu )
578  ! lambda = coef_lambda * (L/N)^{-mu}
579  ! A = coef_A*N*lambda^slope_A
580  real(rp), private, save :: coef_a(hydro_max)
581  real(rp), private, save :: coef_lambda(hydro_max)
582 ! real(RP), private, save :: slope_A(HYDRO_MAX)
583  ! coefficeint of weighted ventilation effect.
584  ! large, and small branch is by PK97(13-60),(13-61),(13-88),(13-89)
585  real(rp), private, save :: ah_vent (hydro_max,2) !
586  real(rp), private, save :: bh_vent (hydro_max,2) !
587  real(rp), private, save :: ah_vent0 (hydro_max,2) !
588  real(rp), private, save :: bh_vent0 (hydro_max,2) !
589  real(rp), private, save :: ah_vent1 (hydro_max,2) !
590  real(rp), private, save :: bh_vent1 (hydro_max,2) !
591  ! coefficient of collision growth
592  real(rp), private, save :: delta_b0 (hydro_max)
593  real(rp), private, save :: delta_b1 (hydro_max)
594  real(rp), private, save :: delta_ab0(hydro_max,hydro_max)
595  real(rp), private, save :: delta_ab1(hydro_max,hydro_max)
596  !
597  real(rp), private, save :: theta_b0 (hydro_max)
598  real(rp), private, save :: theta_b1 (hydro_max)
599  real(rp), private, save :: theta_ab0(hydro_max,hydro_max)
600  real(rp), private, save :: theta_ab1(hydro_max,hydro_max)
601  !
602  logical, private, save :: opt_debug=.false.
603  !
604  logical, private, save :: opt_debug_inc=.true.
605  logical, private, save :: opt_debug_act=.true.
606  logical, private, save :: opt_debug_ree=.true.
607  logical, private, save :: opt_debug_bcs=.true.
608 
609  logical, save, private :: opt_collection_bin = .false. ! SO22
610 
611  logical, private, save :: mp_doautoconversion = .true.
612  logical, private, save :: mp_couple_aerosol = .false. ! apply CCN effect?
613  real(rp), private, save :: mp_ssw_lim = 1.e+1_rp
614 
615  !
616  ! namelist variables for nucleation
617  !
618  ! total aerosol number concentration [/m3]
619  real(rp), private, parameter :: c_ccn_ocean= 1.00e+8_rp
620  real(rp), private, parameter :: c_ccn_land = 1.26e+9_rp
621  real(rp), private, save :: c_ccn = 1.00e+8_rp
622  ! aerosol activation factor
623  real(rp), private, parameter :: kappa_ocean= 0.462_rp
624  real(rp), private, parameter :: kappa_land = 0.308_rp
625  real(rp), private, save :: kappa = 0.462_rp
626  real(rp), private, save :: c_in = 1.0_rp
627  ! SB06 (36)
628  real(rp), private, save :: nm_m92 = 1.e+3_rp
629  real(rp), private, save :: am_m92 = -0.639_rp
630  real(rp), private, save :: bm_m92 = 12.96_rp
631  !
632  real(rp), private, save :: in_max = 1000.e+3_rp ! max num. of Ice-Nuclei [num/m3]
633  real(rp), private, save :: ssi_max= 0.60_rp
634  real(rp), private, save :: ssw_max= 1.1_rp ! [%]
635  !
636  real(rp), private, save :: qke_min = 0.03_rp ! sigma=0.1[m/s], 09/08/18 T.Mitsui
637  real(rp), private, save :: tem_ccn_low=233.150_rp ! = -40 degC ! [Add] 10/08/03 T.Mitsui
638  real(rp), private, save :: tem_in_low =173.150_rp ! = -100 degC ! [Add] 10/08/03 T.Mitsui
639  logical, private, save :: nucl_twomey = .false.
640  logical, private, save :: inucl_w = .false.
641  logical, private, save :: so22_het = .false. ! SO22
642  logical, private, save :: opt_nucleation_ice_hom = .false. ! SO22
643 
644  ! for incomplete gamma function
645  real(rp), private, parameter :: rc_cr= 12.e-6_rp ! critical size[micron]
646  real(rp), private, save :: xc_cr ! mass[kg] of cloud with r=critical size[micron]
647  real(rp), private, save :: alpha ! slope parameter of gamma function
648  real(rp), private, save :: gm, lgm ! gamma(alpha), log(gamma(alpha))
649 
650 
651  !=== for collection
652  !--- threshold of diameters to collide with others
653  real(rp), private, save :: dc0 = 15.0e-6_rp ! lower threshold of cloud
654  real(rp), private, save :: dc1 = 40.0e-6_rp ! upper threshold of cloud
655  real(rp), private, save :: di0 = 150.0e-6_rp ! lower threshold of cloud
656  real(rp), private, save :: ds0 = 150.0e-6_rp ! lower threshold of cloud
657  real(rp), private, save :: dg0 = 150.0e-6_rp ! lower threshold of cloud
658  !--- standard deviation of terminal velocity[m/s]
659  real(rp), private, save :: sigma_c=0.00_rp ! cloud
660  real(rp), private, save :: sigma_r=0.00_rp ! rain
661  real(rp), private, save :: sigma_i=0.2_rp ! ice
662  real(rp), private, save :: sigma_s=0.2_rp ! snow
663  real(rp), private, save :: sigma_g=0.00_rp ! graupel
664  !--- max collection efficiency for cloud
665  real(rp), private, save :: e_im = 0.80_rp ! ice max
666  real(rp), private, save :: e_sm = 0.80_rp ! snow max
667  real(rp), private, save :: e_gm = 1.00_rp ! graupel max
668  !--- collection efficiency between 2 species
669  real(rp), private, save :: e_ir=1.0_rp ! ice x rain
670  real(rp), private, save :: e_sr=1.0_rp ! snow x rain
671  real(rp), private, save :: e_gr=1.0_rp ! graupel x rain
672  real(rp), private, save :: e_ii=1.0_rp ! ice x ice
673  real(rp), private, save :: e_si=1.0_rp ! snow x ice
674  real(rp), private, save :: e_gi=1.0_rp ! graupel x ice
675  real(rp), private, save :: e_ss=1.0_rp ! snow x snow
676  real(rp), private, save :: e_gs=1.0_rp ! graupel x snow
677  real(rp), private, save :: e_gg=1.0_rp ! graupel x graupel
678  !=== for partial conversion
679  !--- flag: 1=> partial conversion to graupel, 0=> no conversion
680  integer, private, save :: i_iconv2g=1 ! ice => graupel
681  integer, private, save :: i_sconv2g=1 ! snow => graupel
682  !--- bulk density of graupel
683  real(rp), private, save :: rho_g = 900.0_rp ! [kg/m3]
684  !--- space filling coefficient [%]
685  real(rp), private, save :: cfill_i = 0.68_rp ! ice
686  real(rp), private, save :: cfill_s = 0.01_rp ! snow
687  !--- critical diameter for ice conversion
688  real(rp), private, save :: di_cri = 500.e-6_rp ! [m]
689  logical, private, save :: opt_stick_ks96=.false.
690  logical, private, save :: opt_stick_co86=.false.
691  ! from Seiki and Ohno (2022)
692  logical, private, save :: opt_stick_rhh57=.false.
693  logical, private, save :: opt_stick_rhks96=.false.
694  real(rp), private, save :: tem_min_estick=253.0_rp
695  logical, private, save :: opt_stick_c12=.false.
696 
697  real(rp), private, save :: fac_cndc = 1.0_rp
698  logical, private, save :: opt_fix_taucnd_c=.false.
699 
700  ! limitter for vapor diffusivity
701  ! this value was suggested in Pruppacher and Klett(1997),(13-3)
702  ! although Hall and Pruppacher (1976) extrapolated upto -80 deg
703  real(rp), private, save :: temc_lim_diff = -80.0_rp ! HP76
704  ! -40.0_RP ! PK97
705 
706 
707 
708  !-----------------------------------------------------------------------------
709 contains
710  !-----------------------------------------------------------------------------
715  KA, IA, JA )
716  use scale_prc, only: &
717  prc_abort
718  use scale_file_history, only: &
720  implicit none
721  integer, intent(in) :: ka
722  integer, intent(in) :: ia
723  integer, intent(in) :: ja
724 
725  namelist / param_atmos_phy_mp_sn14 / &
726  mp_doautoconversion, &
727  mp_ssw_lim, &
728  mp_couple_aerosol
729 
730  integer :: ip
731  integer :: ierr
732  !---------------------------------------------------------------------------
733 
734  log_newline
735  log_info("ATMOS_PHY_MP_sn14_setup",*) 'Setup'
736  log_info("ATMOS_PHY_MP_sn14_setup",*) 'Seiki and Nakajima (2014) 2-moment bulk 6 category'
737 
738  !--- read namelist
739  rewind(io_fid_conf)
740  read(io_fid_conf,nml=param_atmos_phy_mp_sn14,iostat=ierr)
741  if( ierr < 0 ) then !--- missing
742  log_info("ATMOS_PHY_MP_sn14_setup",*) 'Not found namelist. Default used.'
743  elseif( ierr > 0 ) then !--- fatal error
744  log_error("ATMOS_PHY_MP_sn14_setup",*) 'Not appropriate names in namelist PARAM_ATMOS_PHY_MP_SN14. Check!'
745  call prc_abort
746  endif
747  log_nml(param_atmos_phy_mp_sn14)
748 
749  call mp_sn14_init
750 
751  allocate(nc_uplim_d(1,ia,ja))
752  nc_uplim_d(:,:,:) = 150.e6_rp
753 
754  hist_max = 0
755  hist_idx(:) = -1
756  do ip = 1, w_nmax
757  call file_history_reg( w_name(ip), 'individual tendency term in SN14', 'kg/kg/s', &
758  hist_id(ip) )
759  if ( hist_id(ip) > 0 ) then
760  hist_max = hist_max + 1
761  hist_idx(ip) = hist_max
762  end if
763  enddo
764  allocate( w3d(ka,ia,ja,hist_max) )
765  w3d(:,:,:,:) = 0.0_rp
766 
767  return
768  end subroutine atmos_phy_mp_sn14_setup
769 
770  !-----------------------------------------------------------------------------
773 
774  deallocate(nc_uplim_d)
775  deallocate(w3d)
776 
777  return
778  end subroutine atmos_phy_mp_sn14_finalize
779 
780  !-----------------------------------------------------------------------------
785  KA, KS, KE, IA, IS, IE, JA, JS, JE, &
786  DENS, &
787  W, &
788  QTRC, &
789  PRES, &
790  TEMP, &
791  Qdry, &
792  CPtot, &
793  CVtot, &
794  CCN, &
795  dt, &
796  cz, &
797  fz, &
798  RHOQ_t, &
799  RHOE_t, &
800  CPtot_t, &
801  CVtot_t, &
802  EVAPORATE, &
803  flg_lt, &
804  d0_crg, v0_crg, &
805  dqcrg, &
806  beta_crg, &
807  QTRC_crg, &
808  QSPLT_in, Sarea, &
809  RHOQcrg_t )
810  implicit none
811 
812  integer, intent(in) :: ka, ks, ke
813  integer, intent(in) :: ia, is, ie
814  integer, intent(in) :: ja, js, je
815 
816  real(rp), intent(in) :: dens (ka,ia,ja)
817  real(rp), intent(in) :: w (ka,ia,ja)
818  real(rp), intent(in) :: qtrc (ka,ia,ja,qa_mp)
819  real(rp), intent(in) :: pres(ka,ia,ja)
820  real(rp), intent(in) :: temp(ka,ia,ja)
821  real(rp), intent(in) :: qdry(ka,ia,ja)
822  real(rp), intent(in) :: cptot(ka,ia,ja)
823  real(rp), intent(in) :: cvtot(ka,ia,ja)
824  real(rp), intent(in) :: ccn (ka,ia,ja)
825  real(dp), intent(in) :: dt
826  real(rp), intent(in) :: cz( ka,ia,ja)
827  real(rp), intent(in) :: fz(0:ka,ia,ja)
828 
829  real(rp), intent(out) :: rhoq_t (ka,ia,ja,qa_mp)
830  real(rp), intent(out) :: rhoe_t (ka,ia,ja)
831  real(rp), intent(out) :: cptot_t(ka,ia,ja)
832  real(rp), intent(out) :: cvtot_t(ka,ia,ja)
833  real(rp), intent(out) :: evaporate(ka,ia,ja) !--- number of evaporated cloud [/m3]
834 
835  ! Optional for Lightning
836  logical, intent(in), optional :: flg_lt
837  real(rp), intent(in), optional :: d0_crg, v0_crg
838  real(rp), intent(in), optional :: dqcrg(ka,ia,ja)
839  real(rp), intent(in), optional :: beta_crg(ka,ia,ja)
840  real(rp), intent(in), optional :: qtrc_crg(ka,ia,ja,hydro_max)
841  real(rp), intent(out), optional :: qsplt_in(ka,ia,ja,3)
842  real(rp), intent(out), optional :: sarea(ka,ia,ja,hydro_max)
843  real(rp), intent(out), optional :: rhoqcrg_t(ka,ia,ja,hydro_max)
844  !---------------------------------------------------------------------------
845 
846  log_progress(*) 'atmosphere / physics / microphysics / SN14'
847 
848 #ifdef PROFILE_FIPP
849  call fipp_start()
850 #endif
851 
852  !##### MP Main #####
853  call mp_sn14 ( &
854  ka, ks, ke, ia, is, ie, ja, js, je, &
855  dens(:,:,:), w(:,:,:), qtrc(:,:,:,:), pres(:,:,:), temp(:,:,:), & ! (in)
856  qdry(:,:,:), cptot(:,:,:), cvtot(:,:,:), ccn(:,:,:), & ! (in)
857  real(dt,rp), cz(:,:,:), fz(:,:,:), & ! (in)
858  rhoq_t(:,:,:,:), rhoe_t(:,:,:), cptot_t(:,:,:), cvtot_t(:,:,:), & ! (out)
859  evaporate(:,:,:), & ! (out)
860  flg_lt, d0_crg, v0_crg, dqcrg(:,:,:), beta_crg(:,:,:), & ! (optional in)
861  qtrc_crg(:,:,:,:), & ! (optional in)
862  qsplt_in(:,:,:,:), sarea(:,:,:,:), rhoqcrg_t(:,:,:,:) ) ! (optional out)
863 
864 #ifdef PROFILE_FIPP
865  call fipp_stop()
866 #endif
867 
868  return
869  end subroutine atmos_phy_mp_sn14_tendency
870 
871  !-----------------------------------------------------------------------------
876  KA, KS, KE, IA, IS, IE, JA, JS, JE, &
877  QTRC, &
878  mask_criterion, &
879  cldfrac )
880  implicit none
881  integer, intent(in) :: ka, ks, ke
882  integer, intent(in) :: ia, is, ie
883  integer, intent(in) :: ja, js, je
884 
885  real(rp), intent(in) :: qtrc (ka,ia,ja,qa_mp-1)
886  real(rp), intent(in) :: mask_criterion
887 
888  real(rp), intent(out) :: cldfrac(ka,ia,ja)
889 
890  real(rp) :: qhydro
891  integer :: k, i, j, iq
892  !---------------------------------------------------------------------------
893 
894  !$omp parallel do &
895  !$omp private(qhydro)
896  do j = js, je
897  do i = is, ie
898  do k = ks, ke
899  qhydro = 0.0_rp
900  do iq = i_mp_qc, i_mp_qg
901  qhydro = qhydro + qtrc(k,i,j,iq)
902  enddo
903  cldfrac(k,i,j) = 0.5_rp + sign(0.5_rp,qhydro-mask_criterion)
904  enddo
905  enddo
906  enddo
907 
908  return
909  end subroutine atmos_phy_mp_sn14_cloud_fraction
910  !-----------------------------------------------------------------------------
915  KA, KS, KE, IA, IS, IE, JA, JS, JE, &
916  DENS0, TEMP0, QTRC0, &
917  Re )
918  use scale_atmos_hydrometeor, only: &
919  n_hyd, &
920  i_hc, &
921  i_hr, &
922  i_hi, &
923  i_hs, &
924  i_hg, &
925  i_hh
926  implicit none
927  integer, intent(in) :: ka, ks, ke
928  integer, intent(in) :: ia, is, ie
929  integer, intent(in) :: ja, js, je
930 
931  real(rp), intent(in) :: dens0(ka,ia,ja) ! density [kg/m3]
932  real(rp), intent(in) :: temp0(ka,ia,ja) ! temperature [K]
933  real(rp), intent(in) :: qtrc0(ka,ia,ja,i_qc:i_ng) ! tracer mass concentration [kg/kg]
934 
935  real(rp), intent(out) :: re (ka,ia,ja,n_hyd) ! effective radius [cm]
936 
937  ! mass concentration[kg/m3] and mean particle mass[kg]
938  real(rp) :: xc(ka)
939  real(rp) :: xr(ka)
940  real(rp) :: xi(ka)
941  real(rp) :: xs(ka)
942  real(rp) :: xg(ka)
943  ! diameter of average mass[kg/m3]
944  real(rp) :: dc_ave(ka)
945  real(rp) :: dr_ave(ka)
946  ! radius of average mass
947  real(rp) :: rc, rr
948  ! 2nd. and 3rd. order moment of DSD
949  real(rp) :: ri2m(ka), ri3m(ka)
950  real(rp) :: rs2m(ka), rs3m(ka)
951  real(rp) :: rg2m(ka), rg3m(ka)
952 
953  real(rp), parameter :: coef_fuetal1998 = 3.0_rp / (4.0_rp*rhoi)
954 
955  ! r2m_min is minimum value(moment of 1 particle with 1 micron)
956  real(rp), parameter :: r2m_min=1.e-12_rp
957  real(rp), parameter :: um2cm = 100.0_rp
958 
959  real(rp) :: limitsw, zerosw
960  integer :: k, i, j
961  !---------------------------------------------------------------------------
962 
963  !$omp parallel do &
964  !$omp private(xc,xr,xi,xs,xg,dc_ave,dr_ave,rc,rr,ri2m,ri3m,rs2m,rs3m,rg2m,rg3m, &
965  !$omp limitsw,zerosw)
966  do j = js, je
967  do i = is, ie
968 
969  ! mean particle mass[kg]
970  do k = ks, ke
971  xc(k) = min( xc_max, max( xc_min, dens0(k,i,j)*qtrc0(k,i,j,i_qc)/(qtrc0(k,i,j,i_nc)+nc_min) ) )
972  xr(k) = min( xr_max, max( xr_min, dens0(k,i,j)*qtrc0(k,i,j,i_qr)/(qtrc0(k,i,j,i_nr)+nr_min) ) )
973  xi(k) = min( xi_max, max( xi_min, dens0(k,i,j)*qtrc0(k,i,j,i_qi)/(qtrc0(k,i,j,i_ni)+ni_min) ) )
974  xs(k) = min( xs_max, max( xs_min, dens0(k,i,j)*qtrc0(k,i,j,i_qs)/(qtrc0(k,i,j,i_ns)+ns_min) ) )
975  xg(k) = min( xg_max, max( xg_min, dens0(k,i,j)*qtrc0(k,i,j,i_qg)/(qtrc0(k,i,j,i_ng)+ng_min) ) )
976  enddo
977 
978  ! diameter of average mass : SB06 eq.(32)
979  do k = ks, ke
980  dc_ave(k) = a_m(i_mp_qc) * xc(k)**b_m(i_mp_qc)
981  dr_ave(k) = a_m(i_mp_qr) * xr(k)**b_m(i_mp_qr)
982  enddo
983 
984  ! cloud effective radius
985  do k = ks, ke
986  rc = 0.5_rp * dc_ave(k)
987  limitsw = 0.5_rp + sign(0.5_rp, rc-rmin_re )
988  re(k,i,j,i_hc) = coef_re(i_mp_qc) * rc * limitsw * um2cm
989  enddo
990 
991  ! rain effective radius
992  do k = ks, ke
993  rr = 0.5_rp * dr_ave(k)
994  limitsw = 0.5_rp + sign(0.5_rp, rr-rmin_re )
995  re(k,i,j,i_hr) = coef_re(i_mp_qr) * rr * limitsw * um2cm
996  enddo
997 
998  do k = ks, ke
999  ri2m(k) = pi * coef_rea2(i_mp_qi) * qtrc0(k,i,j,i_ni) * a_rea2(i_mp_qi) * xi(k)**b_rea2(i_mp_qi)
1000  rs2m(k) = pi * coef_rea2(i_mp_qs) * qtrc0(k,i,j,i_ns) * a_rea2(i_mp_qs) * xs(k)**b_rea2(i_mp_qs)
1001  rg2m(k) = pi * coef_rea2(i_mp_qg) * qtrc0(k,i,j,i_ng) * a_rea2(i_mp_qg) * xg(k)**b_rea2(i_mp_qg)
1002  enddo
1003 
1004  ! Fu(1996), eq.(3.11) or Fu et al.(1998), eq.(2.5)
1005  do k = ks, ke
1006  ri3m(k) = coef_fuetal1998 * qtrc0(k,i,j,i_ni) * xi(k)
1007  rs3m(k) = coef_fuetal1998 * qtrc0(k,i,j,i_ns) * xs(k)
1008  rg3m(k) = coef_fuetal1998 * qtrc0(k,i,j,i_ng) * xg(k)
1009  enddo
1010 
1011  ! ice effective radius
1012  do k = ks, ke
1013  zerosw = 0.5_rp - sign(0.5_rp, ri2m(k) - r2m_min )
1014  re(k,i,j,i_hi) = ri3m(k) / ( ri2m(k) + zerosw ) * ( 1.0_rp - zerosw ) * um2cm
1015  enddo
1016 
1017  ! snow effective radius
1018  do k = ks, ke
1019  zerosw = 0.5_rp - sign(0.5_rp, rs2m(k) - r2m_min )
1020  re(k,i,j,i_hs) = rs3m(k) / ( rs2m(k) + zerosw ) * ( 1.0_rp - zerosw ) * um2cm
1021  enddo
1022 
1023  ! graupel effective radius
1024  do k = ks, ke
1025  zerosw = 0.5_rp - sign(0.5_rp, rg2m(k) - r2m_min )
1026  re(k,i,j,i_hg) = rg3m(k) / ( rg2m(k) + zerosw ) * ( 1.0_rp - zerosw ) * um2cm
1027  enddo
1028 
1029  do k = ks, ke
1030  re(k,i,j,i_hh) = 0.0_rp
1031  end do
1032 
1033  enddo
1034  enddo
1035 
1036 
1037  return
1038  end subroutine atmos_phy_mp_sn14_effective_radius
1039  !-----------------------------------------------------------------------------
1044  KA, KS, KE, IA, IS, IE, JA, JS, JE, &
1045  QTRC0, &
1046  Qe )
1047  use scale_atmos_hydrometeor, only: &
1048  n_hyd, &
1049  i_hc, &
1050  i_hr, &
1051  i_hi, &
1052  i_hs, &
1053  i_hg, &
1054  i_hh
1055  implicit none
1056  integer, intent(in) :: ka, ks, ke
1057  integer, intent(in) :: ia, is, ie
1058  integer, intent(in) :: ja, js, je
1059 
1060  real(rp), intent(in) :: qtrc0(ka,ia,ja,qa_mp-1) ! tracer mass concentration [kg/kg]
1061 
1062  real(rp), intent(out) :: qe (ka,ia,ja,n_hyd) ! mixing ratio of each cateory [kg/kg]
1063 
1064  integer :: k, i, j
1065  !---------------------------------------------------------------------------
1066 
1067 !OCL XFILL
1068  !$omp parallel do
1069  do j = js, je
1070  do i = is, ie
1071  do k = ks, ke
1072  qe(k,i,j,i_hc) = qtrc0(k,i,j,i_mp_qc)
1073  qe(k,i,j,i_hr) = qtrc0(k,i,j,i_mp_qr)
1074  qe(k,i,j,i_hi) = qtrc0(k,i,j,i_mp_qi)
1075  qe(k,i,j,i_hs) = qtrc0(k,i,j,i_mp_qs)
1076  qe(k,i,j,i_hg) = qtrc0(k,i,j,i_mp_qg)
1077  qe(k,i,j,i_hh) = 0.0_rp
1078  end do
1079  end do
1080  end do
1081 
1082  return
1083  end subroutine atmos_phy_mp_sn14_qtrc2qhyd
1084 
1087  KA, KS, KE, IA, IS, IE, JA, JS, JE, &
1088  QTRC0, &
1089  Ne )
1090  use scale_atmos_hydrometeor, only: &
1091  n_hyd, &
1092  i_hc, &
1093  i_hr, &
1094  i_hi, &
1095  i_hs, &
1096  i_hg, &
1097  i_hh
1098  implicit none
1099  integer, intent(in) :: ka, ks, ke
1100  integer, intent(in) :: ia, is, ie
1101  integer, intent(in) :: ja, js, je
1102 
1103  real(rp), intent(in) :: qtrc0(ka,ia,ja,qa_mp-1) ! tracer mass concentration [kg/kg]
1104 
1105  real(rp), intent(out) :: ne (ka,ia,ja,n_hyd) ! number density of each cateory [1/m3]
1106 
1107  integer :: k, i, j
1108  !---------------------------------------------------------------------------
1109 
1110 !OCL XFILL
1111  !$omp parallel do
1112  do j = js, je
1113  do i = is, ie
1114  do k = ks, ke
1115  ne(k,i,j,i_hc) = qtrc0(k,i,j,i_mp_nc)
1116  ne(k,i,j,i_hr) = qtrc0(k,i,j,i_mp_nr)
1117  ne(k,i,j,i_hi) = qtrc0(k,i,j,i_mp_ni)
1118  ne(k,i,j,i_hs) = qtrc0(k,i,j,i_mp_ns)
1119  ne(k,i,j,i_hg) = qtrc0(k,i,j,i_mp_ng)
1120  ne(k,i,j,i_hh) = 0.0_rp
1121  end do
1122  end do
1123  end do
1124 
1125  return
1126  end subroutine atmos_phy_mp_sn14_qtrc2nhyd
1127 
1129  KA, KS, KE, IA, IS, IE, JA, JS, JE, &
1130  Qe, &
1131  QTRC, &
1132  QNUM )
1133  use scale_const, only: &
1134  pi => const_pi, &
1135  undef => const_undef
1136  use scale_atmos_hydrometeor, only: &
1137  n_hyd, &
1138  i_hc, &
1139  i_hr, &
1140  i_hi, &
1141  i_hs, &
1142  i_hg, &
1143  i_hh
1144  implicit none
1145  integer, intent(in) :: ka, ks, ke
1146  integer, intent(in) :: ia, is, ie
1147  integer, intent(in) :: ja, js, je
1148 
1149  real(rp), intent(in) :: qe(ka,ia,ja,n_hyd) ! mass ratio of each cateory [kg/kg]
1150 
1151  real(rp), intent(out) :: qtrc(ka,ia,ja,qa_mp-1) ! tracer mass concentration [kg/kg]
1152 
1153  real(rp), intent(in), optional :: qnum(ka,ia,ja,n_hyd)
1154 
1155  real(rp), parameter :: dc = 20.e-6_rp ! typical particle diameter for cloud [m]
1156  real(rp), parameter :: dr = 200.e-6_rp ! typical particle diameter for rain [m]
1157  real(rp), parameter :: di = 80.e-6_rp ! typical particle diameter for ice [m]
1158  real(rp), parameter :: ds = 80.e-6_rp ! typical particle diameter for snow [m]
1159  real(rp), parameter :: dg = 200.e-6_rp ! typical particle diameter for grapel [m]
1160  real(rp), parameter :: b = 3.0_rp ! assume spherical form
1161 
1162  real(rp) :: piov6
1163 
1164  integer :: k, i, j
1165  !---------------------------------------------------------------------------
1166 
1167 
1168 !OCL XFILL
1169  !$omp parallel do
1170  do j = js, je
1171  do i = is, ie
1172  do k = ks, ke
1173  qtrc(k,i,j,i_mp_qc) = qe(k,i,j,i_hc)
1174  end do
1175  end do
1176  end do
1177 
1178 !OCL XFILL
1179  !$omp parallel do
1180  do j = js, je
1181  do i = is, ie
1182  do k = ks, ke
1183  qtrc(k,i,j,i_mp_qr) = qe(k,i,j,i_hr)
1184  end do
1185  end do
1186  end do
1187 
1188 !OCL XFILL
1189  !$omp parallel do
1190  do j = js, je
1191  do i = is, ie
1192  do k = ks, ke
1193  qtrc(k,i,j,i_mp_qi) = qe(k,i,j,i_hi)
1194  end do
1195  end do
1196  end do
1197 
1198 !OCL XFILL
1199  !$omp parallel do
1200  do j = js, je
1201  do i = is, ie
1202  do k = ks, ke
1203  qtrc(k,i,j,i_mp_qs) = qe(k,i,j,i_hs)
1204  end do
1205  end do
1206  end do
1207 
1208 !OCL XFILL
1209  !$omp parallel do
1210  do j = js, je
1211  do i = is, ie
1212  do k = ks, ke
1213  qtrc(k,i,j,i_mp_qg) = qe(k,i,j,i_hg) + qe(k,i,j,i_hh)
1214  end do
1215  end do
1216  end do
1217 
1218  piov6 = pi / 6.0_rp
1219 
1220  if ( present(qnum) ) then
1221 
1222 !OCL XFILL
1223  !$omp parallel do
1224  do j = js, je
1225  do i = is, ie
1226  do k = ks, ke
1227  if ( qnum(k,i,j,i_hc) .ne. undef ) then
1228  qtrc(k,i,j,i_mp_nc) = qnum(k,i,j,i_hc)
1229  else
1230  qtrc(k,i,j,i_mp_nc) = qtrc(k,i,j,i_mp_qc) / ( (piov6*rhow) * dc**b )
1231  end if
1232  end do
1233  end do
1234  end do
1235 
1236 !OCL XFILL
1237  !$omp parallel do
1238  do j = js, je
1239  do i = is, ie
1240  do k = ks, ke
1241  if ( qnum(k,i,j,i_hr) .ne. undef ) then
1242  qtrc(k,i,j,i_mp_nr) = qnum(k,i,j,i_hr)
1243  else
1244  qtrc(k,i,j,i_mp_nr) = qtrc(k,i,j,i_mp_qr) / ( (piov6*rhow) * dr**b )
1245  end if
1246  end do
1247  end do
1248  end do
1249 
1250 !OCL XFILL
1251  !$omp parallel do
1252  do j = js, je
1253  do i = is, ie
1254  do k = ks, ke
1255  if ( qnum(k,i,j,i_hi) .ne. undef ) then
1256  qtrc(k,i,j,i_mp_ni) = qnum(k,i,j,i_hi)
1257  else
1258  qtrc(k,i,j,i_mp_ni) = qtrc(k,i,j,i_mp_qi) / ( (piov6*rhof) * di**b )
1259  end if
1260  end do
1261  end do
1262  end do
1263 
1264 !OCL XFILL
1265  !$omp parallel do
1266  do j = js, je
1267  do i = is, ie
1268  do k = ks, ke
1269  if ( qnum(k,i,j,i_hs) .ne. undef ) then
1270  qtrc(k,i,j,i_mp_ns) = qnum(k,i,j,i_hs)
1271  else
1272  qtrc(k,i,j,i_mp_ns) = qtrc(k,i,j,i_mp_qs) / ( (piov6*rhof) * ds**b )
1273  end if
1274  end do
1275  end do
1276  end do
1277 
1278 !OCL XFILL
1279  !$omp parallel do
1280  do j = js, je
1281  do i = is, ie
1282  do k = ks, ke
1283  if ( qnum(k,i,j,i_hg) .ne. undef ) then
1284  if ( qnum(k,i,j,i_hh) .ne. undef ) then
1285  qtrc(k,i,j,i_mp_ng) = qnum(k,i,j,i_hg) + qnum(k,i,j,i_hh)
1286  else
1287  qtrc(k,i,j,i_mp_ng) = qnum(k,i,j,i_hg)
1288  end if
1289  else
1290  qtrc(k,i,j,i_mp_ng) = qtrc(k,i,j,i_mp_qg) / ( (piov6*rhog) * dg**b )
1291  end if
1292  end do
1293  end do
1294  end do
1295 
1296  else
1297 
1298 !OCL XFILL
1299  !$omp parallel do
1300  do j = js, je
1301  do i = is, ie
1302  do k = ks, ke
1303  qtrc(k,i,j,i_mp_nc) = qtrc(k,i,j,i_mp_qc) / ( (piov6*rhow) * dc**b )
1304  end do
1305  end do
1306  end do
1307 
1308 !OCL XFILL
1309  !$omp parallel do
1310  do j = js, je
1311  do i = is, ie
1312  do k = ks, ke
1313  qtrc(k,i,j,i_mp_nr) = qtrc(k,i,j,i_mp_qr) / ( (piov6*rhow) * dr**b )
1314  end do
1315  end do
1316  end do
1317 
1318 !OCL XFILL
1319  !$omp parallel do
1320  do j = js, je
1321  do i = is, ie
1322  do k = ks, ke
1323  qtrc(k,i,j,i_mp_ni) = qtrc(k,i,j,i_mp_qi) / ( (piov6*rhof) * di**b )
1324  end do
1325  end do
1326  end do
1327 
1328 !OCL XFILL
1329  !$omp parallel do
1330  do j = js, je
1331  do i = is, ie
1332  do k = ks, ke
1333  qtrc(k,i,j,i_mp_ns) = qtrc(k,i,j,i_mp_qs) / ( (piov6*rhof) * ds**b )
1334  end do
1335  end do
1336  end do
1337 
1338 !OCL XFILL
1339  !$omp parallel do
1340  do j = js, je
1341  do i = is, ie
1342  do k = ks, ke
1343  qtrc(k,i,j,i_mp_ng) = qtrc(k,i,j,i_mp_qg) / ( (piov6*rhog) * dg**b )
1344  end do
1345  end do
1346  end do
1347 
1348  end if
1349 
1350  return
1351  end subroutine atmos_phy_mp_sn14_qhyd2qtrc
1352 
1353  !-----------------------------------------------------------------------------
1357 !OCL SERIAL
1359  KA, KS, KE, &
1360  DENS, &
1361  TEMP, &
1362  RHOQ, &
1363  PRES, &
1364  vterm )
1365  !$acc routine vector
1366  use scale_const, only: &
1367  const_undef
1368  implicit none
1369 
1370  integer, intent(in) :: ka, ks, ke
1371 
1372  real(rp), intent(in) :: rhoq(ka,i_qc:i_ng) ! rho * q
1373  real(rp), intent(in) :: dens(ka) ! rho
1374  real(rp), intent(in) :: temp(ka) ! temperature
1375  real(rp), intent(in) :: pres(ka) ! pressure
1376 
1377  real(rp), intent(out) :: vterm(ka,qa_mp-1) ! terminal velocity of cloud mass
1378 
1379  real(rp) :: xq, log_xq ! average mass of 1 particle( mass/number )
1380 
1381  real(rp) :: rhofac ! density factor for terminal velocity
1382  real(rp) :: rhofac_q(ka), log_rhofac_q
1383 
1384  real(rp) :: rlambdar(ka) ! work for diagnosis of Rain DSD ( Seifert, 2008 )
1385  real(rp) :: mud_r
1386  real(rp) :: dq, log_dq ! weigthed diameter. Improved Rogers etal. (1993) formula by T.Mitsui
1387 
1388  real(rp) :: weight ! weighting coefficient for 2-branches is determined by ratio between 0.745mm and weighted diameter. SB06 Table.1
1389  real(rp) :: velq_s ! terminal velocity for small branch of Rogers formula
1390  real(rp) :: velq_l ! terminal velocity for large branch of Rogers formula
1391 
1392  real(rp) :: tmp
1393  integer :: k, i, j, iq
1394  !---------------------------------------------------------------------------
1395 
1396  ! QC, NC
1397  do k = ks, ke
1398  rhofac = rho_0 / max( dens(k), rho_min )
1399 
1400  log_rhofac_q = log(rhofac) * gamma_v(i_mp_qc)
1401  log_xq = log( max( xc_min, min( xc_max, rhoq(k,i_qc) / ( rhoq(k,i_nc) + nc_min ) ) ) )
1402 
1403  vterm(k,i_mp_qc) = - exp( log_rhofac_q + log_coef_vt1(i_mp_qc,1) + log_xq * beta_v(i_mp_qc,1) )
1404 
1405  vterm(k,i_mp_nc) = - exp( log_rhofac_q + log_coef_vt0(i_mp_qc,1) + log_xq * beta_vn(i_mp_qc,1) )
1406  end do
1407 
1408  ! QR, NR
1409  mud_r = 3.0_rp * nu(i_mp_qr) + 2.0_rp
1410  do k = ks, ke
1411  rhofac = rho_0 / max( dens(k), rho_min )
1412  rhofac_q(k) = rhofac**gamma_v(i_mp_qr)
1413  end do
1414  do k = ks, ke
1415  xq = max( xr_min, min( xr_max, rhoq(k,i_qr) / ( rhoq(k,i_nr) + nr_min ) ) )
1416 
1417  rlambdar(k) = a_m(i_mp_qr) * xq**b_m(i_mp_qr) &
1418  * ( (mud_r+3.0_rp) * (mud_r+2.0_rp) * (mud_r+1.0_rp) )**(-0.333333333_rp)
1419  end do
1420 !OCL LOOP_FISSION_TARGET(LS)
1421  do k = ks, ke
1422  dq = ( 4.0_rp + mud_r ) * rlambdar(k) ! D^(3)+mu weighted mean diameter
1423  weight = min( 1.0_rp, max( 0.0_rp, 0.5_rp * ( 1.0_rp + tanh( pi * log( dq/d_vtr_branch ) ) ) ) )
1424  velq_s = coef_vtr_ar2 * dq &
1425  * ( 1.0_rp - ( 1.0_rp + coef_vtr_br2*rlambdar(k) )**(-5.0_rp-mud_r) )
1426  velq_l = coef_vtr_ar1 &
1427  - coef_vtr_br1 * ( 1.0_rp + coef_vtr_cr1*rlambdar(k) )**(-4.0_rp-mud_r)
1428  vterm(k,i_mp_qr) = -rhofac_q(k) * ( velq_l * ( weight ) &
1429  + velq_s * ( 1.0_rp - weight ) )
1430  end do
1431 !OCL LOOP_FISSION_TARGET(LS)
1432  do k = ks, ke
1433  dq = ( 1.0_rp + mud_r ) * rlambdar(k) ! D^(0)+mu weighted mean diameter
1434  weight = min( 1.0_rp, max( 0.0_rp, 0.5_rp * ( 1.0_rp + tanh( pi * log( dq/d_vtr_branch ) ) ) ) )
1435  velq_s = coef_vtr_ar2 * dq &
1436  * ( 1.0_rp - ( 1.0_rp + coef_vtr_br2*rlambdar(k) )**(-2.0_rp-mud_r) )
1437  velq_l = coef_vtr_ar1 &
1438  - coef_vtr_br1 * ( 1.0_rp + coef_vtr_cr1*rlambdar(k) )**(-1.0_rp-mud_r)
1439  vterm(k,i_mp_nr) = -rhofac_q(k) * ( velq_l * ( weight ) &
1440  + velq_s * ( 1.0_rp - weight ) )
1441  end do
1442 
1443  do k = ks, ke
1444  rhofac_q(k) = exp( log( pres(k)/pre0_vt ) * a_pre0_vt + log( temp(k)/tem0_vt ) * a_tem0_vt )
1445  end do
1446 
1447  ! QI, NI
1448 !OCL LOOP_FISSION_TARGET(LS)
1449  do k = ks, ke
1450  log_xq = log( max( xi_min, min( xi_max, rhoq(k,i_qi) / ( rhoq(k,i_ni) + ni_min ) ) ) )
1451 
1452  tmp = log_a_m(i_mp_qi) + log_xq * b_m(i_mp_qi)
1453  log_dq = log_coef_dave_l(i_mp_qi) + tmp
1454  weight = min( 1.0_rp, max( 0.0_rp, 0.5_rp * ( 1.0_rp + log_dq - log_d0_li ) ) )
1455 
1456  velq_s = exp( log_coef_vt1(i_mp_qi,1) + log_xq * beta_v(i_mp_qi,1) )
1457  velq_l = exp( log_coef_vt1(i_mp_qi,2) + log_xq * beta_v(i_mp_qi,2) )
1458  vterm(k,i_mp_qi) = - rhofac_q(k) * ( velq_l * ( weight ) &
1459  + velq_s * ( 1.0_rp - weight ) )
1460 
1461  log_dq = log_coef_dave_n(i_mp_qi) + tmp
1462  weight = min( 1.0_rp, max( 0.0_rp, 0.5_rp * ( 1.0_rp + log_dq - log_d0_ni ) ) )
1463 
1464  velq_s = exp( log_coef_vt0(i_mp_qi,1) + log_xq * beta_vn(i_mp_qi,1) )
1465  velq_l = exp( log_coef_vt0(i_mp_qi,2) + log_xq * beta_vn(i_mp_qi,2) )
1466  vterm(k,i_mp_ni) = - rhofac_q(k) * ( velq_l * ( weight ) &
1467  + velq_s * ( 1.0_rp - weight ) )
1468  end do
1469 
1470  ! QS, NS
1471 !OCL LOOP_FISSION_TARGET(LS)
1472  do k = ks, ke
1473  log_xq = log( max( xs_min, min( xs_max, rhoq(k,i_qs) / ( rhoq(k,i_ns) + ns_min ) ) ) )
1474 
1475  tmp = log_a_m(i_mp_qs) + log_xq * b_m(i_mp_qs)
1476  log_dq = log_coef_dave_l(i_mp_qs) + tmp
1477  weight = min( 1.0_rp, max( 0.0_rp, 0.5_rp * ( 1.0_rp + log_dq - log_d0_ls ) ) )
1478 
1479  velq_s = exp( log_coef_vt1(i_mp_qs,1) + log_xq * beta_v(i_mp_qs,1) )
1480  velq_l = exp( log_coef_vt1(i_mp_qs,2) + log_xq * beta_v(i_mp_qs,2) )
1481  vterm(k,i_mp_qs) = - rhofac_q(k) * ( velq_l * ( weight ) &
1482  + velq_s * ( 1.0_rp - weight ) )
1483 
1484  log_dq = log_coef_dave_n(i_mp_qs) + tmp
1485  weight = min( 1.0_rp, max( 0.0_rp, 0.5_rp * ( 1.0_rp + log_dq - log_d0_ns ) ) )
1486 
1487  velq_s = exp( log_coef_vt0(i_mp_qs,1) + log_xq * beta_vn(i_mp_qs,1) )
1488  velq_l = exp( log_coef_vt0(i_mp_qs,2) + log_xq * beta_vn(i_mp_qs,2) )
1489  vterm(k,i_mp_ns) = - rhofac_q(k) * ( velq_l * ( weight ) &
1490  + velq_s * ( 1.0_rp - weight ) )
1491  end do
1492 
1493  ! QG, NG
1494 !OCL LOOP_FISSION_TARGET(LS)
1495  do k = ks, ke
1496  log_xq = log( max( xg_min, min( xg_max, rhoq(k,i_qg) / ( rhoq(k,i_ng) + ng_min ) ) ) )
1497 
1498  tmp = log_a_m(i_mp_qg) + log_xq * b_m(i_mp_qg)
1499  log_dq = log_coef_dave_l(i_mp_qg) + tmp
1500  weight = min( 1.0_rp, max( 0.0_rp, 0.5_rp * ( 1.0_rp + log_dq - log_d0_lg ) ) )
1501 
1502  velq_s = exp( log_coef_vt1(i_mp_qg,1) + log_xq * beta_v(i_mp_qg,1) )
1503  velq_l = exp( log_coef_vt1(i_mp_qg,2) + log_xq * beta_v(i_mp_qg,2) )
1504  vterm(k,i_mp_qg) = - rhofac_q(k) * ( velq_l * ( weight ) &
1505  + velq_s * ( 1.0_rp - weight ) )
1506 
1507  log_dq = log_coef_dave_n(i_mp_qg) + tmp
1508  weight = min( 1.0_rp, max( 0.0_rp, 0.5_rp * ( 1.0_rp + log_dq - log_d0_ng ) ) )
1509 
1510  velq_s = exp( log_coef_vt0(i_mp_qg,1) + log_xq * beta_vn(i_mp_qg,1) )
1511  velq_l = exp( log_coef_vt0(i_mp_qg,2) + log_xq * beta_vn(i_mp_qg,2) )
1512  vterm(k,i_mp_ng) = - rhofac_q(k) * ( velq_l * ( weight ) &
1513  + velq_s * ( 1.0_rp - weight ) )
1514  enddo
1515 
1516  do iq = 1, qa_mp-1
1517  vterm(1:ks-2 ,iq) = const_undef
1518  vterm(ks-1 ,iq) = vterm(ks,iq)
1519  vterm(ke+1:ka,iq) = const_undef
1520  enddo
1521 
1522  return
1524 
1525 
1526  ! private
1527  !-----------------------------------------------------------------------------
1528  subroutine mp_sn14_init
1529  use scale_prc, only: &
1530  prc_abort
1531  use scale_specfunc, only: &
1532  gammafunc => sf_gamma
1533  implicit none
1534 
1535  real(rp), parameter :: eps_gamma=1.e-30_rp
1536 
1537  real(rp) :: w1(hydro_max)
1538  real(rp) :: w2(hydro_max)
1539  real(rp) :: w3(hydro_max)
1540  real(rp) :: w4(hydro_max)
1541  real(rp) :: w5(hydro_max)
1542  real(rp) :: w6(hydro_max)
1543  real(rp) :: w7(hydro_max)
1544  real(rp) :: w8(hydro_max)
1545 
1546  character(len=H_SHORT) :: wlabel(hydro_max)
1547 
1548  ! work for calculation of capacity, Mitchell and Arnott (1994) , eq.(9)
1549  real(rp) :: ar_ice_fix = 0.7_rp
1550  real(rp) :: wcap1, wcap2
1551  ! work for ventilation coefficient
1552  logical :: flag_vent0(hydro_max), flag_vent1(hydro_max)
1553  integer :: ierr
1554  integer :: iw, ia, ib
1555  integer :: n
1556  !
1557  namelist / param_atmos_phy_mp_sn14_init / &
1558  opt_debug, &
1559  opt_debug_inc, &
1560  opt_debug_act, &
1561  opt_debug_ree, &
1562  opt_debug_bcs, &
1563  opt_collection_bin, &
1564  ntmax_phase_change, &
1565  ntmax_collection
1566  !
1567  namelist / param_atmos_phy_mp_sn14_particles / &
1568  a_m, b_m, alpha_v, beta_v, gamma_v, &
1569  alpha_vn, beta_vn, &
1570  a_area, b_area, cap, &
1571  nu, mu, &
1572  opt_m96_column_ice, &
1573  opt_m96_ice, &
1574  ar_ice_fix
1575 
1576  namelist / param_atmos_phy_mp_sn14_nucleation / &
1577  in_max, & !
1578  c_ccn, kappa, & ! cloud nucleation
1579  nm_m92, am_m92, bm_m92, & ! ice nucleation
1580  xc_ccn, xi_ccn, &
1581  tem_ccn_low, &
1582  tem_in_low, &
1583  ssw_max, ssi_max, &
1584  nucl_twomey, inucl_w, &
1585  so22_het, opt_nucleation_ice_hom
1586 
1587  namelist / param_atmos_phy_mp_sn14_collection / &
1588  dc0, dc1, di0, ds0, dg0, &
1589  sigma_c, sigma_r, sigma_i, sigma_s, sigma_g, &
1590  opt_stick_ks96, &
1591  opt_stick_co86, &
1592  e_im, e_sm, e_gm, &
1593  e_ir, e_sr, e_gr, e_ii, e_si, e_gi, e_ss, e_gs, e_gg, &
1594  i_iconv2g, i_sconv2g, rho_g, cfill_i, cfill_s, di_cri
1595 
1596  !
1597  namelist / param_atmos_phy_mp_sn14_collection_bin / &
1598  dc0, dc1, di0, ds0, dg0, &
1599  opt_stick_ks96, &
1600  opt_stick_co86, &
1601  tem_min_estick, &
1602  opt_stick_rhh57, &
1603  opt_stick_rhks96, &
1604  opt_stick_c12, &
1605  e_im, e_sm, e_gm, &
1606  e_ir, e_sr, e_gr, e_ii, e_si, e_gi, e_ss, e_gs, e_gg, &
1607  i_iconv2g, i_sconv2g, rho_g, cfill_i, cfill_s, di_cri
1608 
1609  namelist / param_atmos_phy_mp_sn14_condensation / &
1610  opt_fix_taucnd_c, fac_cndc
1611 
1612 
1613  a_m(:) = undef8
1614  log_a_m(:) = undef8
1615  b_m(:) = undef8
1616  alpha_v(:,:) = undef8
1617  beta_v(:,:) = undef8
1618  alpha_vn(:,:) = undef8
1619  beta_vn(:,:) = undef8
1620  gamma_v(:) = undef8
1621  a_d2vt(:) = undef8
1622  b_d2vt(:) = undef8
1623  a_area(:) = undef8
1624  b_area(:) = undef8
1625  ax_area(:) = undef8
1626  bx_area(:) = undef8
1627  a_rea(:) = undef8
1628  b_rea(:) = undef8
1629  a_rea2(:) = undef8
1630  b_rea2(:) = undef8
1631  a_rea3(:) = undef8
1632  b_rea3(:) = undef8
1633  nu(:) = undef8
1634  mu(:) = undef8
1635  cap(:) = undef8
1636  coef_m2(:) = undef8
1637  coef_dave_n(:) = undef8
1638  coef_dave_l(:) = undef8
1639  log_coef_dave_n(:) = undef8
1640  log_coef_dave_l(:) = undef8
1641  coef_d(:) = undef8
1642  coef_d3(:) = undef8
1643  coef_d6(:) = undef8
1644  coef_d2v(:) = undef8
1645  coef_md2v(:) = undef8
1646  coef_r2(:) = undef8
1647  coef_r3(:) = undef8
1648  coef_re(:) = undef8
1649  coef_rea2(:) = undef8
1650  coef_rea3(:) = undef8
1651  coef_a(:) = undef8
1652 ! slope_A(:) = UNDEF8
1653  coef_lambda(:) = undef8
1654  coef_vt0(:,:) = undef8
1655  coef_vt1(:,:) = undef8
1656  log_coef_vt0(:,:) = undef8
1657  log_coef_vt1(:,:) = undef8
1658  delta_b0(:) = undef8
1659  delta_b1(:) = undef8
1660  delta_ab0(:,:) = undef8
1661  delta_ab1(:,:) = undef8
1662  theta_b0(:) = undef8
1663  theta_b1(:) = undef8
1664  theta_ab0(:,:) = undef8
1665  theta_ab1(:,:) = undef8
1666  !
1667  ah_vent(:,:) = undef8
1668  ah_vent0(:,:) = undef8
1669  ah_vent1(:,:) = undef8
1670  bh_vent(:,:) = undef8
1671  bh_vent0(:,:) = undef8
1672  bh_vent1(:,:) = undef8
1673 
1674  !--- read namelist
1675  rewind(io_fid_conf)
1676  read(io_fid_conf,nml=param_atmos_phy_mp_sn14_init,iostat=ierr)
1677 
1678  if( ierr < 0 ) then !--- missing
1679  log_info("ATMOS_PHY_MP_sn14_init",*) 'Not found namelist. Default used.'
1680  elseif( ierr > 0 ) then !--- fatal error
1681  log_error("ATMOS_PHY_MP_sn14_init",*) 'Not appropriate names in namelist PARAM_ATMOS_PHY_MP_SN14_init. Check!'
1682  call prc_abort
1683  endif
1684  log_nml(param_atmos_phy_mp_sn14_init)
1685 
1686  !
1687  ! default setting
1688  !
1689  ! Area parameters with mks unit originated by Mitchell(1996)
1690  a_area(i_mp_qc) = pi/4.0_rp ! sphere
1691  a_area(i_mp_qr) = pi/4.0_rp ! sphere
1692  a_area(i_mp_qi) = 0.65_rp*1.e-4_rp*100.0_rp**(2.00_rp) ! Mitchell(1996), Hexagonal Plate
1693  a_area(i_mp_qs) = 0.2285_rp*1.e-4_rp*100.0_rp**(1.88_rp) ! Mitchell(1996), Aggregates
1694  a_area(i_mp_qg) = 0.50_rp*1.e-4_rp*100.0_rp**(2.0_rp) ! Mitchell(1996), Lump Graupel
1695  b_area(i_mp_qc) = 2.0_rp
1696  b_area(i_mp_qr) = 2.0_rp
1697  b_area(i_mp_qi) = 2.0_rp
1698  b_area(i_mp_qs) = 1.88_rp
1699  b_area(i_mp_qg) = 2.0_rp
1700  !
1701  ! Seifert and Beheng(2006), Table. 1 or List of symbols
1702  !----------------------------------------------------------
1703  ! Diameter-Mass relationship
1704  ! D = a * x^b
1705  a_m(i_mp_qc) = 0.124_rp
1706  a_m(i_mp_qr) = 0.124_rp
1707  a_m(i_mp_qi) = 0.217_rp
1708  a_m(i_mp_qs) = 8.156_rp
1709  a_m(i_mp_qg) = 0.190_rp
1710  b_m(i_mp_qc) = 1.0_rp/3.0_rp
1711  b_m(i_mp_qr) = 1.0_rp/3.0_rp
1712  b_m(i_mp_qi) = 0.302_rp
1713  b_m(i_mp_qs) = 0.526_rp
1714  b_m(i_mp_qg) = 0.323_rp
1715  !----------------------------------------------------------
1716  ! Terminal velocity-Mass relationship
1717  ! vt = alpha * x^beta * (rho0/rho)^gamma
1718  alpha_v(i_mp_qc,:)= 3.75e+5_rp
1719  alpha_v(i_mp_qr,:)= 159.0_rp ! not for sedimantation
1720  alpha_v(i_mp_qi,:)= 317.0_rp
1721  alpha_v(i_mp_qs,:)= 27.70_rp
1722  alpha_v(i_mp_qg,:)= 40.0_rp
1723  beta_v(i_mp_qc,:) = 2.0_rp/3.0_rp
1724  beta_v(i_mp_qr,:) = 0.266_rp ! not for sedimantation
1725  beta_v(i_mp_qi,:) = 0.363_rp
1726  beta_v(i_mp_qs,:) = 0.216_rp
1727  beta_v(i_mp_qg,:) = 0.230_rp
1728  gamma_v(i_mp_qc) = 1.0_rp
1729  ! This is high Reynolds number limit(Beard 1980)
1730  gamma_v(i_mp_qr) = 1.0_rp/2.0_rp
1731  gamma_v(i_mp_qi) = 1.0_rp/2.0_rp
1732  gamma_v(i_mp_qs) = 1.0_rp/2.0_rp
1733  gamma_v(i_mp_qg) = 1.0_rp/2.0_rp
1734  !----------------------------------------------------------
1735  ! DSD parameters
1736  ! f(x) = A x^nu exp( -lambda x^mu )
1737  ! Gamma Disribution : mu=1 , nu:arbitrary
1738  ! Marshall-Palmer Distribution: mu=1/3, nu:-2/3
1739  ! In the case of MP, f(D) dD = f(x)dx
1740  ! f(x) = c * f(D)/D^2 (c:coefficient)
1741  nu(i_mp_qc) = 1.0_rp ! arbitrary for Gamma
1742  nu(i_mp_qr) = -1.0_rp/3.0_rp ! nu(diameter)=1, equilibrium condition.
1743  nu(i_mp_qi) = 1.0_rp !
1744  nu(i_mp_qs) = 1.0_rp !
1745  nu(i_mp_qg) = 1.0_rp !
1746  !
1747  mu(i_mp_qc) = 1.0_rp ! Gamma
1748  mu(i_mp_qr) = 1.0_rp/3.0_rp ! Marshall Palmer
1749  mu(i_mp_qi) = 1.0_rp/3.0_rp !
1750  mu(i_mp_qs) = 1.0_rp/3.0_rp !
1751  mu(i_mp_qg) = 1.0_rp/3.0_rp !
1752  !----------------------------------------------------------
1753  ! Geomeries for diffusion growth
1754  ! Pruppacher and Klett(1997), (13-77)-(13-80) and
1755  ! originally derived by McDonald(1963b)
1756  ! sphere: cap=2
1757  ! plate : cap=pi
1758  ! needle with aspect ratio a/b
1759  ! : cap=log(2*a/b)
1760  cap(i_mp_qc) = 2.0_rp ! sphere
1761  cap(i_mp_qr) = 2.0_rp ! sphere
1762  cap(i_mp_qi) = pi ! hexagonal plate
1763  cap(i_mp_qs) = 2.0_rp ! mix aggregates
1764  cap(i_mp_qg) = 2.0_rp ! lump
1765  !
1766  alpha_vn(:,:) = alpha_v(:,:)
1767  beta_vn(:,:) = beta_v(:,:)
1768  !------------------------------------------------------------------------
1769  !
1770  ! additional setting
1771  !
1772 
1773  !--- read namelist
1774  rewind(io_fid_conf)
1775  read(io_fid_conf,nml=param_atmos_phy_mp_sn14_particles,iostat=ierr)
1776  if( ierr < 0 ) then !--- missing
1777  log_info("ATMOS_PHY_MP_sn14_init",*) 'Not found namelist. Default used.'
1778  elseif( ierr > 0 ) then !--- fatal error
1779  log_error("ATMOS_PHY_MP_sn14_init",*) 'Not appropriate names in namelist PARAM_ATMOS_PHY_MP_SN14_particles. Check!'
1780  call prc_abort
1781  endif
1782  log_nml(param_atmos_phy_mp_sn14_particles)
1783 
1784  ! [Add] 10/08/03 T.Mitsui
1785  ! particles shapes are
1786  if( opt_m96_ice ) then
1787  ! ice is randomly oriented Hexagonal plate (Auer and Veal 1970, Takano and Liou 1995, Mitchell 1996)
1788  ! snow is assemblages of planar polycrystals(Mitchell 1996)
1789  ! graupel is Lump graupel(R4b) is assumed(Mitchell 1996)
1790  a_area(i_mp_qi) = 0.120284936_rp
1791  a_area(i_mp_qs) = 0.131488_rp
1792  a_area(i_mp_qg) = 0.5_rp
1793  b_area(i_mp_qi) = 1.850000_rp
1794  b_area(i_mp_qs) = 1.880000_rp
1795  b_area(i_mp_qg) = 2.0_rp
1796  a_m(i_mp_qi) = 1.23655360084766_rp
1797  a_m(i_mp_qs) = a_m(i_mp_qi)
1798  a_m(i_mp_qg) = 0.346111225718402_rp
1799  b_m(i_mp_qi) = 0.408329930583912_rp
1800  b_m(i_mp_qs) = b_m(i_mp_qi)
1801  b_m(i_mp_qg) = 0.357142857142857_rp
1802  !
1803  if( opt_m96_column_ice )then
1804  d0_ni=240.49e-6_rp ! this is column
1805  d0_li=330.09e-6_rp ! this is column
1806  a_area(i_mp_qi)= (0.684_rp*1.e-4_rp)*10.0_rp**(2.0_rp*2.00_rp)
1807  b_area(i_mp_qi)= 2.0_rp
1808  a_m(i_mp_qi) = 0.19834046116844_rp
1809  b_m(i_mp_qi) = 0.343642611683849_rp
1810  ! [Add] 11/08/30 T.Mitsui
1811  ! approximated by the capacity for prolate spheroid with constant aspect ratio
1812  wcap1 = sqrt(1.0_rp-ar_ice_fix**2)
1813  wcap2 = log( (1.0_rp+wcap1)/ar_ice_fix )
1814  cap(i_mp_qi) = 2.0_rp*wcap2/wcap1
1815  !
1816  end if
1817  !
1818  ! These value are derived by least-square fitting in the range
1819  ! qi [100um:1000um] in diameter
1820  ! qs [100um:1000um] in diameter
1821  ! qg [200um:2000um] in diameter
1822  ! small branch , large branch
1823  if( opt_m96_column_ice )then
1824  alpha_v(i_mp_qi,:) = (/2901.0_rp, 32.20_rp/)
1825  alpha_vn(i_mp_qi,:) = (/9675.2_rp, 64.16_rp/)
1826  else
1827  alpha_v(i_mp_qi,:) =(/ 5798.60107421875_rp, 167.347076416016_rp/)
1828  alpha_vn(i_mp_qi,:) =(/ 12408.177734375_rp, 421.799865722656_rp/)
1829  end if
1830  alpha_v(i_mp_qs,:) =(/ 15173.3916015625_rp, 305.678619384766_rp/)
1831  alpha_vn(i_mp_qs,:) =(/ 29257.1601562500_rp, 817.985717773438_rp/)
1832  alpha_v(i_mp_qg,:) =(/ 15481.6904296875_rp, 311.642242431641_rp/)
1833  alpha_vn(i_mp_qg,:) =(/ 27574.6562500000_rp, 697.536132812500_rp/)
1834  !
1835  beta_v(i_mp_qi,:) =(/ 0.504873454570770_rp, 0.324817866086960_rp/)
1836  beta_vn(i_mp_qi,:) =(/ 0.548495233058929_rp, 0.385287821292877_rp/)
1837  if( opt_m96_column_ice )then
1838  beta_v(i_mp_qi,:) =(/ 0.465552181005478_rp, 0.223826110363007_rp/)
1839  beta_vn(i_mp_qi,:) =(/ 0.530453503131866_rp, 0.273761242628098_rp/)
1840  end if
1841  beta_v(i_mp_qs,:) =(/ 0.528109610080719_rp, 0.329863965511322_rp/)
1842  beta_vn(i_mp_qs,:) =(/ 0.567154467105865_rp, 0.393876969814301_rp/)
1843  beta_v(i_mp_qg,:) =(/ 0.534656763076782_rp, 0.330253750085831_rp/)
1844  beta_vn(i_mp_qg,:) =(/ 0.570551633834839_rp, 0.387124240398407_rp/)
1845  end if
1846  !
1847  ! area-diameter relation => area-mass relation
1848  ax_area(:) = a_area(:)*a_m(:)**b_area(:)
1849  bx_area(:) = b_area(:)*b_m(:)
1850  !
1851  ! radius of equivalent area - m ass relation
1852  ! pi*rea**2 = ax_area*x**bx_area
1853  a_rea(:) = sqrt(ax_area(:)/pi)
1854  b_rea(:) = bx_area(:)/2.0_rp
1855  a_rea2(:) = a_rea(:)**2
1856  b_rea2(:) = b_rea(:)*2.0_rp
1857  a_rea3(:) = a_rea(:)**3
1858  b_rea3(:) = b_rea(:)*3.0_rp
1859  !
1860  a_d2vt(:)=alpha_v(:,2)*(1.0_rp/alpha_v(:,2))**(beta_v(:,2)/b_m(:))
1861  b_d2vt(:)=(beta_v(:,2)/b_m(:))
1862  !
1863  ! Calculation of Moment Coefficient
1864  !
1865  w1(:) = 0.0_rp
1866  w2(:) = 0.0_rp
1867  w3(:) = 0.0_rp
1868  w4(:) = 0.0_rp
1869  w5(:) = 0.0_rp
1870  w6(:) = 0.0_rp
1871  w7(:) = 0.0_rp
1872  w8(:) = 0.0_rp
1873  !-------------------------------------------------------
1874  ! moment coefficient
1875  ! SB06 (82)
1876  ! M^n /= coef_mn * N * (L/N)**n
1877  ! M^2 = Z = coef_m2 * N *(L/N)**2
1878  ! a*M^b = a*integral x^b f(x) dx = ave D
1879  do iw=1, hydro_max
1880  n = 2
1881  w1(iw) = gammafunc( (n+nu(iw)+1.0_rp)/mu(iw) )
1882  w2(iw) = gammafunc( (nu(iw)+1.0_rp)/mu(iw) )
1883  w3(iw) = gammafunc( (nu(iw)+2.0_rp)/mu(iw) )
1884  coef_m2(iw) = w1(iw)/w2(iw)*( w2(iw)/w3(iw) )**n
1885  !
1886  w4(iw) = gammafunc( (b_m(iw)+nu(iw)+1.0_rp)/mu(iw) )
1887  coef_d(iw) = a_m(iw) * w4(iw)/w2(iw)*( w2(iw)/w3(iw) )**b_m(iw)
1888  w5(iw) = gammafunc( (2.0_rp*b_m(iw)+beta_v(iw,2)+nu(iw)+1.0_rp)/mu(iw) )
1889  w6(iw) = gammafunc( (3.0_rp*b_m(iw)+beta_v(iw,2)+nu(iw)+1.0_rp)/mu(iw) )
1890  coef_d2v(iw) = a_m(iw) * w6(iw)/w5(iw)* ( w2(iw)/w3(iw) )**b_m(iw)
1891  coef_md2v(iw)= w5(iw)/w2(iw)* ( w2(iw)/w3(iw) )**(2.0_rp*b_m(iw)+beta_v(iw,2))
1892  ! 09/04/14 [Add] T.Mitsui, volume and radar reflectivity
1893  w7(iw) = gammafunc( (3.0_rp*b_m(iw)+nu(iw)+1.0_rp)/mu(iw) )
1894  coef_d3(iw) = a_m(iw)**3 * w7(iw)/w2(iw)*( w2(iw)/w3(iw) )**(3.0_rp*b_m(iw))
1895  w8(iw) = gammafunc( (6.0_rp*b_m(iw)+nu(iw)+1.0_rp)/mu(iw) )
1896  coef_d6(iw) = a_m(iw)**6 * w8(iw)/w2(iw)*( w2(iw)/w3(iw) )**(6.0_rp*b_m(iw))
1897  end do
1898  !
1899  coef_deplc = coef_d(i_mp_qc)/a_m(i_mp_qc)
1900  !-------------------------------------------------------
1901  ! coefficient of 2nd and 3rd moments for effective radius
1902  ! for spherical particle
1903  do iw=1, hydro_max
1904  ! integ r^2 f(x)dx
1905  w1(iw) = gammafunc( (2.0_rp*b_m(iw)+nu(iw)+1.0_rp)/mu(iw) )
1906  w2(iw) = gammafunc( (nu(iw)+1.0_rp)/mu(iw) )
1907  w3(iw) = gammafunc( (nu(iw)+2.0_rp)/mu(iw) )
1908  ! integ r^3 f(x)dx
1909  w4(iw) = gammafunc( (3.0_rp*b_m(iw)+nu(iw)+1.0_rp)/mu(iw) )
1910  !
1911  coef_r2(iw)=w1(iw)/w2(iw)*( w2(iw)/w3(iw) )**(2.0_rp*b_m(iw))
1912  coef_r3(iw)=w4(iw)/w2(iw)*( w2(iw)/w3(iw) )**(3.0_rp*b_m(iw))
1913  coef_re(iw)=coef_r3(iw)/coef_r2(iw)
1914  !
1915  end do
1916  !-------------------------------------------------------
1917  ! coefficient for effective radius of equivalent area and
1918  ! coefficient for volume of equivalent area
1919  do iw=1, hydro_max
1920  w1(iw) = gammafunc( (nu(iw)+1.0_rp)/mu(iw) )
1921  w2(iw) = gammafunc( (nu(iw)+2.0_rp)/mu(iw) )
1922  w3(iw) = gammafunc( (b_rea2(iw)+nu(iw)+1.0_rp)/mu(iw) )
1923  w4(iw) = gammafunc( (b_rea3(iw)+nu(iw)+1.0_rp)/mu(iw) )
1924  !
1925  coef_rea2(iw) = w3(iw)/w1(iw)*( w1(iw)/w2(iw) )**b_rea2(iw)
1926  coef_rea3(iw) = w4(iw)/w1(iw)*( w1(iw)/w2(iw) )**b_rea3(iw)
1927  end do
1928  !-------------------------------------------------------
1929  ! coefficient of gamma-distribution
1930  ! SB06(80)
1931  do iw=1, hydro_max
1932  w1(iw) = gammafunc( (nu(iw) + 1.0_rp)/mu(iw) )
1933  w2(iw) = gammafunc( (nu(iw) + 2.0_rp)/mu(iw) )
1934  coef_a(iw) = mu(iw)/w1(iw)
1935 ! slope_A(iw) = w1(iw)
1936  coef_lambda(iw) = (w1(iw)/w2(iw))**(-mu(iw))
1937  end do
1938  !-------------------------------------------------------
1939  ! coefficient for terminal velocity in sedimentation
1940  ! SB06(78)
1941  do ia=1,2
1942  do iw=1, hydro_max
1943  n = 0
1944  w1(iw) = gammafunc( (beta_vn(iw,ia) + nu(iw) + 1.0_rp + n)/mu(iw) )
1945  w2(iw) = gammafunc( ( nu(iw) + 1.0_rp + n)/mu(iw) )
1946  w3(iw) = gammafunc( (nu(iw) + 1.0_rp)/mu(iw) )
1947  w4(iw) = gammafunc( (nu(iw) + 2.0_rp)/mu(iw) )
1948  ! coefficient of terminal velocity for number
1949  coef_vt0(iw,ia) = alpha_vn(iw,ia) * w1(iw) / w2(iw) * ( w3(iw) / w4(iw) )**beta_vn(iw,ia)
1950  log_coef_vt0(iw,ia) = log( coef_vt0(iw,ia) )
1951  n = 1
1952  w1(iw) = gammafunc( (beta_v(iw,ia) + nu(iw) + 1.0_rp + n)/mu(iw) )
1953  w2(iw) = gammafunc( ( nu(iw) + 1.0_rp + n)/mu(iw) )
1954  ! coefficient of terminal velocity for mass
1955  coef_vt1(iw,ia) = alpha_v(iw,ia) * w1(iw) / w2(iw) * ( w3(iw) / w4(iw) )**beta_v(iw,ia)
1956  log_coef_vt1(iw,ia) = log( coef_vt1(iw,ia) )
1957  end do
1958  end do
1959  ! coefficient for weighted diameter used in calculation of terminal velocity
1960  do iw=1, hydro_max
1961  w1(iw) = gammafunc( ( b_m(iw) + nu(iw) + 1.0_rp)/mu(iw) )
1962  w2(iw) = gammafunc( (1.0_rp + b_m(iw) + nu(iw) + 1.0_rp)/mu(iw) )
1963  w3(iw) = gammafunc( (nu(iw) + 1.0_rp)/mu(iw) )
1964  w4(iw) = gammafunc( (nu(iw) + 2.0_rp)/mu(iw) )
1965  coef_dave_n(iw) = ( w1(iw) / w3(iw) ) * ( w3(iw) / w4(iw) )**( b_m(iw))
1966  coef_dave_l(iw) = ( w2(iw) / w3(iw) ) * ( w3(iw) / w4(iw) )**(1.0_rp+b_m(iw))
1967  log_coef_dave_n(iw) = log( coef_dave_n(iw) )
1968  log_coef_dave_l(iw) = log( coef_dave_l(iw) )
1969  end do
1970  !-------------------------------------------------------
1971  !
1972  ah_vent(i_mp_qc,1:2) = (/1.0000_rp,1.0000_rp/) ! no effect
1973  ah_vent(i_mp_qr,1:2) = (/1.0000_rp,0.780_rp/)
1974  ah_vent(i_mp_qi,1:2) = (/1.0000_rp,0.860_rp/)
1975  ah_vent(i_mp_qs,1:2) = (/1.0000_rp,0.780_rp/)
1976  ah_vent(i_mp_qg,1:2) = (/1.0000_rp,0.780_rp/)
1977  bh_vent(i_mp_qc,1:2) = (/0.0000_rp,0.0000_rp/)
1978  bh_vent(i_mp_qr,1:2) = (/0.108_rp,0.308_rp/)
1979  bh_vent(i_mp_qi,1:2) = (/0.140_rp,0.280_rp/)
1980  bh_vent(i_mp_qs,1:2) = (/0.108_rp,0.308_rp/)
1981  bh_vent(i_mp_qg,1:2) = (/0.108_rp,0.308_rp/)
1982  !
1983  do iw=1, hydro_max
1984  n = 0
1985  if( (nu(iw) + b_m(iw) + n) > eps_gamma )then
1986  w1(iw) = gammafunc( (nu(iw) + b_m(iw) + n)/mu(iw) )
1987  w2(iw) = gammafunc( (nu(iw) + 1.0_rp)/mu(iw) )
1988  w3(iw) = gammafunc( (nu(iw) + 2.0_rp)/mu(iw) )
1989  ah_vent0(iw,1)= ah_vent(iw,1)*(w1(iw)/w2(iw))*(w2(iw)/w3(iw))**(b_m(iw)+n-1.0_rp)
1990  ah_vent0(iw,2)= ah_vent(iw,2)*(w1(iw)/w2(iw))*(w2(iw)/w3(iw))**(b_m(iw)+n-1.0_rp)
1991  flag_vent0(iw)=.true.
1992  else
1993  ah_vent0(iw,1)= 1.0_rp
1994  ah_vent0(iw,2)= 1.0_rp
1995  flag_vent0(iw)=.false.
1996  end if
1997  n = 1
1998  if( (nu(iw) + b_m(iw) + n) > eps_gamma )then
1999  w1(iw) = gammafunc( (nu(iw) + b_m(iw) + n)/mu(iw) )
2000  w2(iw) = gammafunc( (nu(iw) + 1.0_rp)/mu(iw) )
2001  w3(iw) = gammafunc( (nu(iw) + 2.0_rp)/mu(iw) )
2002  ah_vent1(iw,1)= ah_vent(iw,1)*(w1(iw)/w2(iw))*(w2(iw)/w3(iw))**(b_m(iw)+n-1.0_rp)
2003  ah_vent1(iw,2)= ah_vent(iw,2)*(w1(iw)/w2(iw))*(w2(iw)/w3(iw))**(b_m(iw)+n-1.0_rp)
2004  flag_vent1(iw)=.true.
2005  else
2006  ah_vent1(iw,1)= 1.0_rp
2007  ah_vent1(iw,2)= 1.0_rp
2008  flag_vent1(iw)=.true.
2009  end if
2010  end do
2011  do iw=1, hydro_max
2012  n = 0
2013  if( (nu(iw) + 1.5_rp*b_m(iw) + 0.5_rp*beta_v(iw,1) + n) < eps_gamma )then
2014  flag_vent0(iw)=.false.
2015  end if
2016  if(flag_vent0(iw))then
2017 ! w1(iw) = gammafunc( (nu(iw) + 1.5_RP*b_m(iw) + 0.5_RP*beta_v(iw,1) + n)/mu(iw) )
2018  w2(iw) = gammafunc( (nu(iw) + 1.0_rp)/mu(iw) )
2019  w3(iw) = gammafunc( (nu(iw) + 2.0_rp)/mu(iw) )
2020  ! [Add] 11/08/30 T.Mitsui
2021  w4(iw) = gammafunc( (nu(iw) + 2.0_rp*b_m(iw) + beta_v(iw,1) + n)/mu(iw) )
2022  bh_vent0(iw,1)=bh_vent(iw,1)*(w4(iw)/w2(iw))*(w2(iw)/w3(iw))**(2.00_rp*b_m(iw)+beta_v(iw,1)+n-1.0_rp)
2023  w5(iw) = gammafunc( (nu(iw) + 1.5_rp*b_m(iw) + 0.5_rp*beta_v(iw,2) + n)/mu(iw) )
2024  bh_vent0(iw,2)=bh_vent(iw,2)*(w5(iw)/w2(iw))*(w2(iw)/w3(iw))**(1.5_rp*b_m(iw)+0.5_rp*beta_v(iw,2)+n-1.0_rp)
2025  else
2026  bh_vent0(iw,1) = 0.0_rp
2027  bh_vent0(iw,2) = 0.0_rp
2028  end if
2029  !
2030  n = 1
2031  if( (nu(iw) + 1.5_rp*b_m(iw) + 0.5_rp*beta_v(iw,1) + n) < eps_gamma )then
2032  flag_vent1(iw)=.false.
2033  end if
2034  if(flag_vent1(iw))then
2035 ! w1(iw) = gammafunc( (nu(iw) + 1.5_RP*b_m(iw) + 0.5_RP*beta_v(iw,1) + n)/mu(iw) )
2036  w2(iw) = gammafunc( (nu(iw) + 1.0_rp)/mu(iw) )
2037  w3(iw) = gammafunc( (nu(iw) + 2.0_rp)/mu(iw) )
2038  ! [Add] 11/08/30 T.Mitsui
2039  w4(iw) = gammafunc( (nu(iw) + 2.0_rp*b_m(iw) + beta_v(iw,1) + n)/mu(iw) )
2040  bh_vent1(iw,1)=bh_vent(iw,1)*(w4(iw)/w2(iw))*(w2(iw)/w3(iw))**(2.00_rp*b_m(iw)+beta_v(iw,1)+n-1.0_rp)
2041  !
2042  w5(iw) = gammafunc( (nu(iw) + 1.5_rp*b_m(iw) + 0.5_rp*beta_v(iw,2) + n)/mu(iw) )
2043  bh_vent1(iw,2)=bh_vent(iw,2)*(w5(iw)/w2(iw))*(w2(iw)/w3(iw))**(1.5_rp*b_m(iw)+0.5_rp*beta_v(iw,2)+n-1.0_rp)
2044  else
2045  bh_vent1(iw,1) = 0.0_rp
2046  bh_vent1(iw,2) = 0.0_rp
2047  end if
2048  end do
2049  !-------------------------------------------------------
2050  ! coefficient for collision process
2051  ! stochastic coefficient for collision cross section
2052  ! sb06 (90) -- self collection
2053  do iw=1, hydro_max
2054  n = 0
2055  w1(iw) = gammafunc( (2.0_rp*b_rea(iw) + nu(iw) + 1.0_rp + n)/mu(iw) )
2056  w2(iw) = gammafunc( (nu(iw) + 1.0_rp)/mu(iw) )
2057  w3(iw) = gammafunc( (nu(iw) + 2.0_rp)/mu(iw) )
2058  delta_b0(iw) = w1(iw)/w2(iw) &
2059  *( w2(iw)/w3(iw) )**(2.0_rp*b_rea(iw) + n)
2060  n = 1
2061  w1(iw) = gammafunc( (2.0_rp*b_rea(iw) + nu(iw) + 1.0_rp + n)/mu(iw) )
2062  delta_b1(iw) = w1(iw)/w2(iw) &
2063  *( w2(iw)/w3(iw) )**(2.0_rp*b_rea(iw) + n)
2064  end do
2065  ! stochastic coefficient for collision cross section
2066  ! sb06(91) -- riming( collide with others )
2067  do iw=1, hydro_max
2068  n = 0
2069  w1(iw) = gammafunc( (b_rea(iw) + nu(iw) + 1.0_rp + n)/mu(iw) )
2070  w2(iw) = gammafunc( (nu(iw) + 1.0_rp)/mu(iw) )
2071  w3(iw) = gammafunc( (nu(iw) + 2.0_rp)/mu(iw) )
2072  w4(iw) = gammafunc( (b_rea(iw) + nu(iw) + 1.0_rp )/mu(iw) )
2073  n = 1
2074  w5(iw) = gammafunc( (b_rea(iw) + nu(iw) + 1.0_rp + n)/mu(iw) )
2075  end do
2076  ! ia > ib ( larger particles "a" catch smaller particles "b" )
2077  do ia=1, hydro_max
2078  do ib=1, hydro_max
2079  n=0 !
2080  ! NOTE, collected particle has a moment of n.
2081  ! collecting particle has only number(n=0).
2082  delta_ab0(ia,ib) = 2.0_rp*(w1(ib)/w2(ib))*(w4(ia)/w2(ia)) &
2083  * ( w2(ib)/w3(ib) )**(b_rea(ib)+n) &
2084  * ( w2(ia)/w3(ia) )**(b_rea(ia) )
2085  n=1 !
2086  delta_ab1(ia,ib) = 2.0_rp*(w5(ib)/w2(ib))*(w4(ia)/w2(ia)) &
2087  * ( w2(ib)/w3(ib) )**(b_rea(ib)+n) &
2088  * ( w2(ia)/w3(ia) )**(b_rea(ia) )
2089  end do
2090  end do
2091  ! stochastic coefficient for terminal velocity
2092  ! sb06(92) -- self collection
2093  ! assuming equivalent area circle.
2094  do iw=1, hydro_max
2095  n = 0
2096  w1(iw) = gammafunc( (2.0_rp*beta_v(iw,2) + 2.0_rp*b_rea(iw) + nu(iw) + 1.0_rp + n)/mu(iw) )
2097  w2(iw) = gammafunc( ( 2.0_rp*b_rea(iw) + nu(iw) + 1.0_rp + n)/mu(iw) )
2098  w3(iw) = gammafunc( (nu(iw) + 1.0_rp)/mu(iw) )
2099  w4(iw) = gammafunc( (nu(iw) + 2.0_rp)/mu(iw) )
2100  theta_b0(iw) = w1(iw)/w2(iw) * ( w3(iw)/w4(iw) )**(2.0_rp*beta_v(iw,2))
2101  n = 1
2102  w1(iw) = gammafunc( (2.0_rp*beta_v(iw,2) + 2.0_rp*b_rea(iw) + nu(iw) + 1.0_rp + n)/mu(iw) )
2103  w2(iw) = gammafunc( ( 2.0_rp*b_rea(iw) + nu(iw) + 1.0_rp + n)/mu(iw) )
2104  theta_b1(iw) = w1(iw)/w2(iw) * ( w3(iw)/w4(iw) )**(2.0_rp*beta_v(iw,2))
2105  end do
2106  !
2107  ! stochastic coefficient for terminal velocity
2108  ! sb06(93) -- riming( collide with others )
2109  do iw=1, hydro_max
2110  n = 0
2111  w1(iw) = gammafunc( (beta_v(iw,2) + 2.0_rp*b_rea(iw) + nu(iw) + 1.0_rp + n)/mu(iw) )
2112  w2(iw) = gammafunc( ( 2.0_rp*b_rea(iw) + nu(iw) + 1.0_rp + n)/mu(iw) )
2113  w3(iw) = gammafunc( (beta_v(iw,2) + 2.0_rp*b_rea(iw) + nu(iw) + 1.0_rp )/mu(iw) )
2114  w4(iw) = gammafunc( ( 2.0_rp*b_rea(iw) + nu(iw) + 1.0_rp )/mu(iw) )
2115  !
2116  w5(iw) = gammafunc( (nu(iw) + 1.0_rp)/mu(iw) )
2117  w6(iw) = gammafunc( (nu(iw) + 2.0_rp)/mu(iw) )
2118  n = 1
2119  w7(iw) = gammafunc( (beta_v(iw,2) + b_rea(iw) + nu(iw) + 1.0_rp + n)/mu(iw) )
2120  w8(iw) = gammafunc( ( b_rea(iw) + nu(iw) + 1.0_rp + n)/mu(iw) )
2121  end do
2122  ! ia > ib ( larger particles "a" catch smaller particles "b" )
2123  do ia=1, hydro_max
2124  do ib=1, hydro_max
2125  theta_ab0(ia,ib) = 2.0_rp * (w1(ib)/w2(ib))*(w3(ia)/w4(ia)) &
2126  * (w5(ia)/w6(ia))**beta_v(ia,2) &
2127  * (w5(ib)/w6(ib))**beta_v(ib,2)
2128  theta_ab1(ia,ib) = 2.0_rp * (w7(ib)/w8(ib))*(w3(ia)/w4(ia)) &
2129  * (w5(ia)/w6(ia))**beta_v(ia,2) &
2130  * (w5(ib)/w6(ib))**beta_v(ib,2)
2131  end do
2132  end do
2133 
2134  rewind(io_fid_conf)
2135  read(io_fid_conf, nml=param_atmos_phy_mp_sn14_nucleation, iostat=ierr)
2136  if( ierr < 0 ) then !--- missing
2137  log_info("ATMOS_PHY_MP_sn14_init",*) 'PARAM_ATMOS_PHY_MP_SN14_nucleation is not specified. Default used.'
2138  elseif( ierr > 0 ) then !--- fatal error
2139  log_error("ATMOS_PHY_MP_sn14_init",*) 'Not appropriate names in namelist PARAM_ATMOS_PHY_MP_SN14_nucleation. Check!'
2140  call prc_abort
2141  endif
2142  log_nml(param_atmos_phy_mp_sn14_nucleation)
2143  if ( mp_couple_aerosol .AND. nucl_twomey ) then
2144  log_error("ATMOS_PHY_MP_SN14_nucleation_kij",*) "nucl_twomey should be false when MP_couple_aerosol is true, stop"
2145  call prc_abort
2146  endif
2147 
2148 
2149  if ( opt_collection_bin ) then
2150 
2151  rewind(io_fid_conf)
2152  read(io_fid_conf,nml=param_atmos_phy_mp_sn14_collection_bin,iostat=ierr)
2153  if ( ierr < 0 ) then
2154  log_info("ATMOS_PHY_MP_sn14_init",*) 'PARAM_ATMOS_PHY_MP_SN14_collection_bin is not specified. Default used.'
2155  elseif( ierr > 0 ) then
2156  log_error("ATMOS_PHY_MP_sn14_init",*) 'xxx Not appropriate names in namelist PARAM_ATMOS_PHY_MP_SN14_collection_bin. STOP.' ! write(IO_FID_LOG,*)
2157  call prc_abort
2158  endif
2159  log_nml(param_atmos_phy_mp_sn14_collection_bin)
2160 
2161  else
2162 
2163  rewind( io_fid_conf )
2164  read( io_fid_conf, nml=param_atmos_phy_mp_sn14_collection, iostat=ierr )
2165  if( ierr < 0 ) then !--- missing
2166  log_info("ATMOS_PHY_MP_sn14_init",*) 'PARAM_ATMOS_PHY_MP_SN14_collection is not specified. Default used.'
2167  elseif( ierr > 0 ) then !--- fatal error
2168  log_error("ATMOS_PHY_MP_sn14_init",*) 'Not appropriate names in namelist PARAM_ATMOS_PHY_MP_SN14_collection. Check!'
2169  call prc_abort
2170  endif
2171  log_nml(param_atmos_phy_mp_sn14_collection)
2172 
2173  end if
2174 
2175 
2176  rewind(io_fid_conf)
2177  read (io_fid_conf,nml=param_atmos_phy_mp_sn14_condensation, iostat=ierr )
2178  if( ierr < 0 ) then !--- missing
2179  log_info("ATMOS_PHY_MP_sn14_init",*) 'PARAM_ATMOS_PHY_MP_SN14_condensation is not specified. Default used.'
2180  elseif( ierr > 0 ) then !--- fatal error
2181  log_error("ATMOS_PHY_MP_sn14_init",*) 'Not appropriate names in namelist PARAM_ATMOS_PHY_MP_SN14_condensation. Check!'
2182  call prc_abort
2183  endif
2184  log_nml(param_atmos_phy_mp_sn14_condensation)
2185 
2186 
2187 
2188  ! work for Incomplete Gamma function
2189  xc_cr = (2.0_rp*rc_cr/a_m(i_mp_qc))**(1.0_rp/b_m(i_mp_qc))
2190  alpha = (nu(i_mp_qc)+1.0_rp)/mu(i_mp_qc)
2191  gm = gammafunc(alpha)
2192  lgm = log(gm)
2193 
2194 
2195  ! log
2196  do ia=1, hydro_max
2197  log_a_m(ia) = log( a_m(ia) )
2198  log_alpha_v(ia,1) = log( alpha_v(ia,1) )
2199  log_alpha_v(ia,2) = log( alpha_v(ia,2) )
2200  log_beta_v(ia,1) = log( beta_v(ia,1) )
2201  log_beta_v(ia,2) = log( beta_v(ia,2) )
2202  end do
2203  log_d0_li = log( d0_li )
2204  log_d0_ni = log( d0_ni )
2205 
2206  wlabel(1) = "CLOUD"
2207  wlabel(2) = "RAIN"
2208  wlabel(3) = "ICE"
2209  wlabel(4) = "SNOW"
2210  wlabel(5) = "GRAUPEL"
2211 
2212  log_info("ATMOS_PHY_MP_sn14_init",'(100a16)') "LABEL ",wlabel(:)
2213  log_info("ATMOS_PHY_MP_sn14_init",'(a,100ES16.6)') "capacity ",cap(:) ! [Add] 11/08/30 T.Mitsui
2214  log_info("ATMOS_PHY_MP_sn14_init",'(a,100ES16.6)') "coef_m2 ",coef_m2(:)
2215  log_info("ATMOS_PHY_MP_sn14_init",'(a,100ES16.6)') "coef_d ",coef_d(:)
2216  !
2217  log_info("ATMOS_PHY_MP_sn14_init",'(a,100ES16.6)') "coef_d3 ",coef_d3(:)
2218  log_info("ATMOS_PHY_MP_sn14_init",'(a,100ES16.6)') "coef_d6 ",coef_d6(:)
2219  log_info("ATMOS_PHY_MP_sn14_init",'(a,100ES16.6)') "coef_d2v ",coef_d2v(:)
2220  log_info("ATMOS_PHY_MP_sn14_init",'(a,100ES16.6)') "coef_md2v ",coef_md2v(:)
2221  log_info("ATMOS_PHY_MP_sn14_init",'(a,100ES16.6)') "a_d2vt ",a_d2vt(:)
2222  log_info("ATMOS_PHY_MP_sn14_init",'(a,100ES16.6)') "b_d2vt ",b_d2vt(:)
2223  !
2224  log_info("ATMOS_PHY_MP_sn14_init",'(a,100ES16.6)') "coef_r2 ",coef_r2(:)
2225  log_info("ATMOS_PHY_MP_sn14_init",'(a,100ES16.6)') "coef_r3 ",coef_r3(:)
2226  log_info("ATMOS_PHY_MP_sn14_init",'(a,100ES16.6)') "coef_re ",coef_re(:)
2227  !
2228  log_info("ATMOS_PHY_MP_sn14_init",'(a,100ES16.6)') "a_area ",a_area(:)
2229  log_info("ATMOS_PHY_MP_sn14_init",'(a,100ES16.6)') "b_area ",b_area(:)
2230  log_info("ATMOS_PHY_MP_sn14_init",'(a,100ES16.6)') "ax_area ",ax_area(:)
2231  log_info("ATMOS_PHY_MP_sn14_init",'(a,100ES16.6)') "bx_area ",bx_area(:)
2232  log_info("ATMOS_PHY_MP_sn14_init",'(a,100ES16.6)') "a_rea ",a_rea(:)
2233  log_info("ATMOS_PHY_MP_sn14_init",'(a,100ES16.6)') "b_rea ",b_rea(:)
2234  log_info("ATMOS_PHY_MP_sn14_init",'(a,100ES16.6)') "a_rea3 ",a_rea3(:)
2235  log_info("ATMOS_PHY_MP_sn14_init",'(a,100ES16.6)') "b_rea3 ",b_rea3(:)
2236  !
2237  log_info("ATMOS_PHY_MP_sn14_init",'(a,100ES16.6)') "coef_rea2 ",coef_rea2(:)
2238  log_info("ATMOS_PHY_MP_sn14_init",'(a,100ES16.6)') "coef_rea3 ",coef_rea3(:)
2239  log_info("ATMOS_PHY_MP_sn14_init",'(a,100ES16.6)') "coef_vt0 ",coef_vt0(:,1)
2240  log_info("ATMOS_PHY_MP_sn14_init",'(a,100ES16.6)') "coef_vt1 ",coef_vt1(:,1)
2241  log_info("ATMOS_PHY_MP_sn14_init",'(a,100ES16.6)') "coef_A ",coef_a(:)
2242  log_info("ATMOS_PHY_MP_sn14_init",'(a,100ES16.6)') "coef_lambda ",coef_lambda(:)
2243 
2244  log_info("ATMOS_PHY_MP_sn14_init",'(a,100ES16.6)') "ah_vent0 sml",ah_vent0(:,1)
2245  log_info("ATMOS_PHY_MP_sn14_init",'(a,100ES16.6)') "ah_vent0 lrg",ah_vent0(:,2)
2246  log_info("ATMOS_PHY_MP_sn14_init",'(a,100ES16.6)') "ah_vent1 sml",ah_vent1(:,1)
2247  log_info("ATMOS_PHY_MP_sn14_init",'(a,100ES16.6)') "ah_vent1 lrg",ah_vent1(:,2)
2248  log_info("ATMOS_PHY_MP_sn14_init",'(a,100ES16.6)') "bh_vent0 sml",bh_vent0(:,1)
2249  log_info("ATMOS_PHY_MP_sn14_init",'(a,100ES16.6)') "bh_vent0 lrg",bh_vent0(:,2)
2250  log_info("ATMOS_PHY_MP_sn14_init",'(a,100ES16.6)') "bh_vent1 sml",bh_vent1(:,1)
2251  log_info("ATMOS_PHY_MP_sn14_init",'(a,100ES16.6)') "bh_vent1 lrg",bh_vent1(:,2)
2252 
2253  log_info("ATMOS_PHY_MP_sn14_init",'(a,100ES16.6)') "delta_b0 ",delta_b0(:)
2254  log_info("ATMOS_PHY_MP_sn14_init",'(a,100ES16.6)') "delta_b1 ",delta_b1(:)
2255  log_info("ATMOS_PHY_MP_sn14_init",'(a,100ES16.6)') "theta_b0 ",theta_b0(:)
2256  log_info("ATMOS_PHY_MP_sn14_init",'(a,100ES16.6)') "theta_b1 ",theta_b1(:)
2257 
2258  do ia=1, hydro_max
2259  log_info("ATMOS_PHY_MP_sn14_init",'(a,a10,a,100ES16.6)') "delta0(a,b)=(",trim(wlabel(ia)),",b)=",(delta_ab0(ia,ib),ib=1,hydro_max)
2260  enddo
2261  do ia=1, hydro_max
2262  log_info("ATMOS_PHY_MP_sn14_init",'(a,a10,a,100ES16.6)') "delta1(a,b)=(",trim(wlabel(ia)),",b)=",(delta_ab1(ia,ib),ib=1,hydro_max)
2263  enddo
2264  do ia=1, hydro_max
2265  log_info("ATMOS_PHY_MP_sn14_init",'(a,a10,a,100ES16.6)') "theta0(a,b)=(",trim(wlabel(ia)),",b)=",(theta_ab0(ia,ib),ib=1,hydro_max)
2266  enddo
2267  do ia=1, hydro_max
2268  log_info("ATMOS_PHY_MP_sn14_init",'(a,a10,a,100ES16.6)') "theta1(a,b)=(",trim(wlabel(ia)),",b)=",(theta_ab1(ia,ib),ib=1,hydro_max)
2269  enddo
2270 
2271  !$acc update device(nu)
2272  !$acc update device(a_m, log_a_m, b_m)
2273  !$acc update device(beta_v, beta_vn, gamma_v)
2274  !$acc update device(log_d0_ni, log_d0_li)
2275  !$acc update device(log_coef_vt0, log_coef_vt1)
2276  !$acc update device(log_coef_dave_N, log_coef_dave_L)
2277 
2278 
2279  return
2280  end subroutine mp_sn14_init
2281  !-----------------------------------------------------------------------------
2282  subroutine mp_sn14 ( &
2283  KA, KS, KE, IA, IS, IE, JA, JS, JE, &
2284  DENS, &
2285  W, &
2286  QTRC, &
2287  PRES0, &
2288  TEMP0, &
2289  Qdry, &
2290  CPtot0, &
2291  CVtot0, &
2292  CCN, &
2293  dt, &
2294  cz, &
2295  fz, &
2296  RHOQ_t, &
2297  RHOE_t, &
2298  CPtot_t, &
2299  CVtot_t, &
2300  EVAPORATE, &
2301  flg_lt, &
2302  d0_crg, &
2303  v0_crg, &
2304  dqcrg, &
2305  beta_crg, &
2306  QTRC_crg, &
2307  QSPLT_in, &
2308  Sarea, &
2309  RHOQcrg_t_mp )
2310  use scale_atmos_hydrometeor, only: &
2311  cp_vapor, &
2312  cp_water, &
2313  cp_ice, &
2314  cv_vapor, &
2315  cv_water, &
2316  cv_ice
2317  use scale_atmos_saturation, only: &
2318  moist_psat_liq => atmos_saturation_psat_liq, &
2319  moist_psat_ice => atmos_saturation_psat_ice, &
2320  moist_pres2qsat_ice => atmos_saturation_pres2qsat_ice
2321  use scale_file_history, only: &
2322  file_history_query, &
2323  file_history_put
2324  implicit none
2325 
2326  integer, intent(in) :: ka, ks, ke
2327  integer, intent(in) :: ia, is, ie
2328  integer, intent(in) :: ja, js, je
2329 
2330  real(rp), intent(in) :: dens (ka,ia,ja)
2331  real(rp), intent(in) :: w (ka,ia,ja)
2332  real(rp), intent(in) :: qtrc (ka,ia,ja,qa_mp)
2333  real(rp), intent(in) :: pres0 (ka,ia,ja)
2334  real(rp), intent(in) :: temp0 (ka,ia,ja)
2335  real(rp), intent(in) :: qdry (ka,ia,ja)
2336  real(rp), intent(in) :: cptot0(ka, ia, ja)
2337  real(rp), intent(in) :: cvtot0(ka, ia, ja)
2338  real(rp), intent(in) :: ccn (ka,ia,ja)
2339  real(rp), intent(in) :: dt
2340  real(rp), intent(in) :: cz( ka,ia,ja)
2341  real(rp), intent(in) :: fz(0:ka,ia,ja)
2342 
2343  real(rp),intent(out) :: rhoq_t(ka,ia,ja,qa_mp)
2344  real(rp),intent(out) :: rhoe_t(ka,ia,ja)
2345  real(rp),intent(out) :: cptot_t(ka,ia,ja)
2346  real(rp),intent(out) :: cvtot_t(ka,ia,ja)
2347 
2348  real(rp), intent(out) :: evaporate(ka,ia,ja) ! number of evaporated cloud [/m3/s]
2349 
2350  !--- for lightning
2351  logical, intent(in), optional :: flg_lt
2352  real(rp), intent(in), optional :: d0_crg, v0_crg
2353  real(rp), intent(in), optional :: dqcrg(ka,ia,ja)
2354  real(rp), intent(in), optional :: beta_crg(ka,ia,ja)
2355  real(rp), intent(in), optional :: qtrc_crg(ka,ia,ja,hydro_max)
2356  real(rp), intent(out), optional :: qsplt_in(ka,ia,ja,3)
2357  real(rp), intent(out), optional :: sarea(ka,ia,ja,hydro_max)
2358  real(rp), intent(out), optional :: rhoqcrg_t_mp(ka,ia,ja,hydro_max)
2359 
2360  real(rp) :: pres (ka)
2361  real(rp) :: temp (ka)
2362  real(rp) :: cva (ka)
2363  real(rp) :: cpa (ka)
2364  real(rp) :: rrho (ka)
2365  real(rp) :: rhoe (ka)
2366  real(rp) :: rhoq (ka,i_qv:i_ng)
2367  !
2368  real(rp) :: rhoq0_t (ka,qa_mp)
2369  real(rp) :: rhoe0_t (ka)
2370  real(rp) :: cptot0_t(ka)
2371  real(rp) :: cvtot0_t(ka)
2372  !
2373  real(rp) :: xq(ka,hydro_max)
2374  !
2375  real(rp) :: dq_xa(ka,hydro_max)
2376  real(rp) :: vt_xa(ka,hydro_max,2) ! terminal velocity
2377 
2378  real(rp) :: wtemp(ka) ! filtered temperature
2379  real(rp) :: esw (ka) ! saturated vapor pressure(water)
2380  real(rp) :: esi (ka) ! saturated vapor pressure(ice)
2381  !
2382  real(rp) :: log_rho_fac
2383  real(rp) :: log_rho_fac_q(ka,hydro_max) ! factor for tracers, 1:cloud, 2:rain, 3:ice, 4: snow, 5:graupel
2384  !
2385  real(rp) :: drhoqv ! d (rho*qv)
2386  real(rp) :: drhoqc, drhonc ! qc, nc
2387  real(rp) :: drhoqr, drhonr ! qr, nr
2388  real(rp) :: drhoqi, drhoni ! qi, ni
2389  real(rp) :: drhoqs, drhons ! qs, ns
2390  real(rp) :: drhoqg, drhong ! qg, ng
2391 
2392  real(rp) :: drhoqvhom ! d (rho*qv)
2393  real(rp) :: drhoqihom, drhonihom ! qi, ni
2394 
2395  ! production rate
2396  real(rp) :: pq(ka,pq_max)
2397  real(rp) :: wrm_dqc, wrm_dnc
2398  real(rp) :: wrm_dqr, wrm_dnr
2399 
2400  ! production rate of mixed-phase collection process
2401  real(rp) :: pac(ka,pac_max)
2402 
2403  real(rp) :: gc_dqc, gc_dnc
2404  real(rp) :: sc_dqc, sc_dnc
2405  real(rp) :: ic_dqc, ic_dnc
2406  real(rp) :: rg_dqg, rg_dng
2407  real(rp) :: rg_dqr, rg_dnr
2408  real(rp) :: rs_dqr, rs_dnr, rs_dqs, rs_dns
2409  real(rp) :: ri_dqr, ri_dnr
2410  real(rp) :: ri_dqi, ri_dni
2411  real(rp) :: ii_dqi, ii_dni
2412  real(rp) :: is_dqi, is_dni, ss_dns
2413  real(rp) :: gs_dqs, gs_dns, gg_dng
2414 
2415  ! mixed-phase collection process total plus(clp_), total minus(clm_)
2416  real(rp) :: clp_dqc, clp_dnc, clm_dqc, clm_dnc
2417  real(rp) :: clp_dqr, clp_dnr, clm_dqr, clm_dnr
2418  real(rp) :: clp_dqi, clp_dni, clm_dqi, clm_dni
2419  real(rp) :: clp_dqs, clp_dns, clm_dqs, clm_dns
2420  real(rp) :: clp_dqg, clp_dng, clm_dqg, clm_dng
2421  real(rp) :: fac1, fac3, fac4(ka), fac6(ka), fac7, fac9(ka)
2422 
2423  ! production rate of partial conversion(ice, snow => graupel)
2424  real(rp) :: pco_dqi, pco_dni
2425  real(rp) :: pco_dqs, pco_dns
2426  real(rp) :: pco_dqg, pco_dng
2427 
2428  ! production rate of enhanced melting due to
2429  real(rp) :: eml_dqc, eml_dnc
2430  real(rp) :: eml_dqr, eml_dnr
2431  real(rp) :: eml_dqi, eml_dni
2432  real(rp) :: eml_dqs, eml_dns
2433  real(rp) :: eml_dqg, eml_dng
2434 
2435  ! production rate of ice multiplication by splintering
2436  real(rp) :: spl_dqi, spl_dni
2437  real(rp) :: spl_dqg, spl_dqs
2438 
2439  !-----------------------------------------------
2440  ! work for explicit supersaturation modeling
2441  !-----------------------------------------------
2442  real(rp) :: dtdt_equiv_d(ka)
2443  real(rp) :: qsi(ka)
2444  real(rp) :: dtdt_dep(ka)
2445  real(rp) :: plidep_total(ka)
2446  !--------------------------------------------------
2447  !
2448  ! variables for output
2449  !
2450  !--------------------------------------------------
2451  ! work for column production term
2452  real(rp) :: sl_plcdep
2453  real(rp) :: sl_plrdep, sl_pnrdep
2454  !--------------------------------------------------
2455  real(rp) :: qke_d(ka)
2456 
2457  real(rp), parameter :: eps = 1.e-19_rp
2458  real(rp), parameter :: eps_qv = 1.e-19_rp
2459  real(rp), parameter :: eps_rhoe = 1.e-19_rp
2460  real(rp), parameter :: eps_rho = 1.e-19_rp
2461 
2462  ! for limitter
2463  real(rp) :: di2l, dtem
2464  real(rp) :: fact(ka)
2465 
2466  real(rp) :: sw
2467 
2468  integer :: k, i, j, iq
2469 
2470  real(rp) :: dqv, dql, dqi
2471  real(rp) :: dcv, dcp
2472  real(rp) :: dqvhom, dqihom
2473  real(rp) :: dcvhom, dcphom
2474 
2475  !---- for Lightning component
2476 ! logical, private, save :: MP_doice_graupel_collection = .false.
2477 ! real(RP), private :: flg_igcol = 0.0_RP
2478  !--- for Charge separation
2479  real(rp) :: v0_crg_l, d0_crg_l
2480  real(rp) :: dqcrg_l(ka)
2481  real(rp) :: beta_crg_l(ka)
2482  real(rp) :: facq(i_qc:i_qg), f_crg
2483  integer :: grid(2), pp, qq
2484  real(rp) :: drhoqcrg_c, drhoqcrg_r
2485  real(rp) :: drhoqcrg_i, drhoqcrg_s, drhoqcrg_g
2486 
2487  ! production rate of charge density
2488  real(rp) :: pcrg1(ka,pq_max)
2489  real(rp) :: pcrg2(ka,pcrg_max)
2490  real(rp) :: rhoq_crg(ka,i_qc:i_qg)
2491  real(rp) :: rhoqcrg0_t(ka,i_qc:i_qg)
2492  real(rp) :: qtrc0(ka,qa_mp)
2493  real(rp) :: crs(ka,hydro_max)
2494 
2495  real(rp) :: crg_split_s
2496  real(rp) :: crg_split_g
2497  real(rp) :: crg_split_i
2498  real(rp) :: wrm_dnc_crg
2499  real(rp) :: wrm_dnr_crg
2500  real(rp) :: gc_dnc_crg
2501  real(rp) :: sc_dnc_crg
2502  real(rp) :: ic_dnc_crg
2503  real(rp) :: rg_dng_crg
2504  real(rp) :: rg_dnr_crg
2505  real(rp) :: rs_dnr_crg
2506  real(rp) :: rs_dns_crg
2507  real(rp) :: ri_dnr_crg
2508  real(rp) :: ri_dni_crg
2509  real(rp) :: ii_dni_crg
2510  real(rp) :: is_dni_crg
2511  real(rp) :: ss_dns_crg
2512  real(rp) :: gs_dns_crg
2513  real(rp) :: gi_dni_crg
2514  real(rp) :: gg_dng_crg
2515  ! mixed-phase collection process total plus(clp_), total minus(clm_)
2516  real(rp) :: clp_dnc_crg, clm_dnc_crg
2517  real(rp) :: clp_dnr_crg, clm_dnr_crg
2518  real(rp) :: clp_dni_crg, clm_dni_crg
2519  real(rp) :: clp_dns_crg, clm_dns_crg
2520  real(rp) :: clp_dng_crg, clm_dng_crg
2521  ! production rate of partial conversion(ice, snow => graupel)
2522  real(rp) :: pco_dni_crg
2523  real(rp) :: pco_dns_crg
2524  real(rp) :: pco_dng_crg
2525  ! production rate of enhanced melting due to
2526  real(rp) :: eml_dnc_crg
2527  real(rp) :: eml_dnr_crg
2528  real(rp) :: eml_dni_crg
2529  real(rp) :: eml_dns_crg
2530  real(rp) :: eml_dng_crg
2531  ! production rate of ice multiplication by splintering
2532  real(rp) :: spl_dni_crg
2533  real(rp) :: spl_dns_crg
2534  real(rp) :: spl_dng_crg
2535  real(rp) :: rate1
2536  logical :: flg_lt_l
2537 
2538  real(rp) :: sw1, sw2
2539  real(rp) :: tmp
2540  integer :: ip
2541 
2542  logical :: hist_sw(w_nmax)
2543  !---------------------------------------------------------------------------
2544 
2545  if ( present(flg_lt) ) then
2546  flg_lt_l = flg_lt
2547  else
2548  flg_lt_l = .false.
2549  end if
2550 
2551 
2552  !--- Lightning component is on
2553  if( flg_lt_l ) then
2554 ! flg_igcol = 0.0_RP
2555  d0_crg_l = d0_crg
2556  v0_crg_l = v0_crg
2557 
2558  !$omp workshare
2559 !OCL ZFILL
2560  qsplt_in(:,:,:,:) = 0.0_rp
2561 !OCL ZFILL
2562  rhoqcrg_t_mp(:,:,:,:) = 0.0_rp
2563  !$omp end workshare
2564 
2565 ! if( MP_doice_graupel_collection ) then
2566 ! flg_igcol = 1.0_RP
2567 ! else
2568 ! write(*,*) 'xxx MP_doice_graupel_collection should be true for TK78 Stop!'
2569 ! call PRC_MPIstop
2570 ! flg_igcol = 0.0_RP
2571 ! endif
2572  else
2573  d0_crg_l = 1.0_rp
2574  v0_crg_l = 1.0_rp
2575  endif
2576 
2577  do ip = 1, w_nmax
2578  call file_history_query( hist_id(ip), hist_sw(ip) )
2579  end do
2580 
2581  !$omp parallel do default(none) &
2582  !$omp shared(KA,KS,KE,IS,IE,JS,JE, &
2583  !$omp CP_VAPOR,CP_WATER,CP_ICE,CV_VAPOR,CV_WATER,CV_ICE,LHV,LHF,LHF0, &
2584  !$omp MP_doautoconversion, &
2585  !$omp DENS,W,QTRC,TEMP0,PRES0,QDRY,CPtot0,CVtot0,CCN, &
2586  !$omp cz,fz,dt, &
2587  !$omp RHOQ_t,RHOE_t,CPtot_t,CVtot_t,EVAPORATE, &
2588  !$omp c_ccn,gamma_v,nc_uplim_d,a_m,b_m,alpha_v,log_alpha_v,beta_v,log_beta_v,a_rea,b_rea, &
2589  !$omp ntmax_phase_change, &
2590  !$omp opt_collection_bin,opt_nucleation_ice_hom,so22_het, &
2591  !$omp w3d,HIST_sw,HIST_idx, &
2592  !$omp QTRC_crg,QSPLT_in,RHOQcrg_t_mp,Sarea, &
2593  !$omp d0_crg_l,v0_crg_l,beta_crg,dqcrg,flg_lt_l) &
2594  !$omp private (pres,temp,rrho,rhoe,rhoq,cva,cpa,rhoq0_t,rhoe0_t,cptot0_t,cvtot0_t, &
2595  !$omp xq,dq_xa,vt_xa,wtemp,esw,esi,log_rho_fac,log_rho_fac_q, &
2596  !$omp drhoqv,drhoqc,drhonc,drhoqr,drhonr,drhoqi,drhoni,drhoqs,drhons,drhoqg,drhong, &
2597  !$omp PQ,Pac,wrm_dqc,wrm_dnc,wrm_dqr,wrm_dnr, &
2598  !$omp gc_dqc,gc_dnc,sc_dqc,sc_dnc,ic_dqc,ic_dnc, &
2599  !$omp rg_dqg,rg_dng,rg_dqr,rg_dnr,rs_dqr,rs_dnr,rs_dqs,rs_dns,ri_dqr,ri_dnr,ri_dqi,ri_dni, &
2600  !$omp ii_dqi,ii_dni,is_dqi,is_dni,ss_dns,gs_dqs,gs_dns,gg_dng, &
2601  !$omp clp_dqc,clp_dnc,clm_dqc,clm_dnc,clp_dqr,clp_dnr,clm_dqr,clm_dnr, &
2602  !$omp clp_dqi,clp_dni,clm_dqi,clm_dni,clp_dqs,clp_dns,clm_dqs,clm_dns,clp_dqg,clp_dng,clm_dqg,clm_dng, &
2603  !$omp dqvhom, dqihom,dcvhom,dcphom,drhoqvhom,drhoqihom,drhonihom, &
2604  !$omp rhoq_crg,RHOQcrg0_t,Pcrg1,Pcrg2, &
2605  !$omp drhoqcrg_c,drhoqcrg_r,drhoqcrg_i,drhoqcrg_s,drhoqcrg_g, &
2606  !$omp crg_split_s,crg_split_g,crg_split_i,wrm_dnc_crg,wrm_dnr_crg,QTRC0,crs, &
2607  !$omp gc_dnc_crg,sc_dnc_crg,ic_dnc_crg,rg_dng_crg,rg_dnr_crg,rs_dnr_crg,rs_dns_crg,ri_dnr_crg,ri_dni_crg, &
2608  !$omp ii_dni_crg,is_dni_crg,ss_dns_crg,gs_dns_crg,gi_dni_crg,gg_dng_crg, &
2609  !$omp clp_dnc_crg,clm_dnc_crg,clp_dnr_crg,clm_dnr_crg,clp_dni_crg,clm_dni_crg,clp_dns_crg,clm_dns_crg,clp_dng_crg,clm_dng_crg, &
2610  !$omp pco_dni_crg,pco_dns_crg,pco_dng_crg,eml_dnc_crg,eml_dnr_crg,eml_dni_crg,eml_dns_crg,eml_dng_crg,spl_dni_crg,spl_dns_crg,spl_dng_crg, &
2611  !$omp fac1,fac3,fac4,fac6,fac7,fac9, &
2612  !$omp pco_dqi,pco_dni,pco_dqs,pco_dns,pco_dqg,pco_dng, &
2613  !$omp eml_dqc,eml_dnc,eml_dqr,eml_dnr,eml_dqi,eml_dni,eml_dqs,eml_dns,eml_dqg,eml_dng, &
2614  !$omp spl_dqi,spl_dni,spl_dqg,spl_dqs, &
2615  !$omp dTdt_equiv_d,sl_PLCdep,sl_PLRdep,sl_PNRdep,qke_d, &
2616  !$omp beta_crg_l,dqcrg_l, &
2617  !$omp dqv,dql,dqi,dcv,dcp, &
2618  !$omp di2l,dtem,fact,sw,sw1,sw2,tmp)
2619  do j = js, je
2620  do i = is, ie
2621 
2622  ! total tendency
2623  do k = ks, ke
2624  rhoq_t(k,i,j,:) = 0.0_rp
2625  rhoe_t(k,i,j) = 0.0_rp
2626  cptot_t(k,i,j) = 0.0_rp
2627  cvtot_t(k,i,j) = 0.0_rp
2628  end do
2629 
2630  ! intermidiate variable
2631  do k = ks, ke
2632  cpa(k) = cptot0(k,i,j)
2633  cva(k) = cvtot0(k,i,j)
2634  pres(k) = pres0(k,i,j)
2635  temp(k) = temp0(k,i,j)
2636  enddo
2637 
2638  !============================================================================
2639  !
2640  !-- Each process is integrated sequentially.
2641  ! 1. Nucleation and filter
2642  ! 2. Phase change
2643  ! 3. Collection
2644  !
2645  !============================================================================
2646 
2647  do iq = i_qv, i_ng
2648  do k = ks, ke
2649  rhoq(k,iq) = dens(k,i,j) * qtrc(k,i,j,iq)
2650  enddo
2651  enddo
2652 
2653  do k = ks, ke
2654  log_rho_fac = log(rho_0 / max(dens(k,i,j),rho_min))
2655  log_rho_fac_q(k,i_mp_qc) = log_rho_fac * gamma_v(i_mp_qc)
2656  log_rho_fac_q(k,i_mp_qr) = log_rho_fac * gamma_v(i_mp_qr)
2657  end do
2658 
2659  if( so22_het .or. opt_nucleation_ice_hom) then
2660 
2661  do k = ks, ke
2662  log_rho_fac_q(k,i_mp_qi) = log(pres(k)/pre0_vt) * a_pre0_vt + log(temp(k)/tem0_vt) * a_tem0_vt
2663  log_rho_fac_q(k,i_mp_qs) = log_rho_fac_q(k,i_mp_qi)
2664  log_rho_fac_q(k,i_mp_qg) = log_rho_fac_q(k,i_mp_qi)
2665  enddo
2666 
2667  call get_terminal_velocity( &
2668  ka, ks, ke, &
2669  vt_xa(:,:,:), xq(:,:), & ! (out)
2670  rhoq(:,:), & ! (in)
2671  log_rho_fac_q(:,:) ) ! (in)
2672 
2673  call get_diamiter( &
2674  ka, ks, ke, &
2675  dq_xa(:,:), & ! (out)
2676  xq(:,:) ) ! (in)
2677 
2678  endif
2679 
2680  !----------------------------------------------------------------------------
2681  !
2682  ! 1.Nucleation of cloud water and cloud ice
2683  !
2684  !----------------------------------------------------------------------------
2685  do k = ks, ke
2686  rrho(k) = 1.0_rp / dens(k,i,j)
2687  rhoe(k) = dens(k,i,j) * temp(k) * cva(k)
2688  wtemp(k) = max(temp(k), tem_min)
2689  enddo
2690 
2691 #ifdef DEBUG
2692  call debug_tem( ka, ks, ke, &
2693  1, i, j, temp(:), dens(:,i,j), pres(:), qtrc(:,i,j,i_qv) )
2694 #endif
2695 
2696  do k = ks, ke
2697  log_rho_fac_q(k,i_mp_qi) = log(pres(k)/pre0_vt) * a_pre0_vt + log(temp(k)/tem0_vt) * a_tem0_vt
2698  log_rho_fac_q(k,i_mp_qs) = log_rho_fac_q(k,i_mp_qi)
2699  log_rho_fac_q(k,i_mp_qg) = log_rho_fac_q(k,i_mp_qi)
2700  enddo
2701 
2702  sl_plcdep = 0.0_rp
2703  sl_plrdep = 0.0_rp
2704  sl_pnrdep = 0.0_rp
2705 
2706 !OCL XFILL
2707  do k = ks, ke
2708  qke_d(k) = 0.0_rp ! 2*TKE
2709  enddo
2710 
2711 !OCL XFILL
2712  do k = ks, ke
2713  dtdt_equiv_d(k) = 0.0_rp
2714  enddo
2715 
2716 ! nc_uplim_d(1) = c_ccn_map(1,i,j)*1.5_RP
2717  nc_uplim_d(1,i,j) = c_ccn*1.5_rp
2718 
2719 
2720  call nucleation( &
2721  ka, ks, ke, &
2722  cz(:,i,j), fz(:,i,j), & ! (in)
2723  w(:,i,j), dens(:,i,j), & ! (in)
2724  wtemp(:), pres(:), qdry(:,i,j), & ! (in)
2725  rhoq(:,:), cpa(:), cva(:), & ! (in)
2726  dtdt_equiv_d(:), & ! (in)
2727  qke_d(:), & ! (in)
2728  ccn(:,i,j), nc_uplim_d(1,i,j), & ! (in)
2729  dt, & ! (in)
2730  dq_xa, vt_xa, & ! (in)
2731  pq(:,:) ) ! (out)
2732 
2733 
2734  if( opt_nucleation_ice_hom ) then
2735 
2736  ! homogeneous ice nucleation
2737  do k = ks, ke
2738  drhoqihom = pq(k,i_lihom)
2739  tmp = - drhoqihom
2740  drhoqvhom = max( - rhoq(k,i_qv) / dt , tmp )
2741  fac1 = drhoqvhom / min( tmp, -eps ) ! drhoqc and drhoqi must be >= 0, otherwise fac1 can be artificially huge value.
2742 
2743  drhoqihom = drhoqihom * fac1
2744 
2745  rhoq0_t(k,i_qv) = drhoqvhom
2746  rhoq0_t(k,i_qi) = drhoqihom
2747 
2748  rhoe0_t(k) = - lhv * drhoqvhom + lhf * drhoqihom
2749 
2750  dqvhom = rrho(k) * drhoqvhom
2751  dqihom = rrho(k) * drhoqihom
2752 
2753  dcvhom = cv_vapor * dqvhom + cv_ice * dqihom
2754  dcphom = cp_vapor * dqvhom + cp_ice * dqihom
2755 
2756  cvtot0_t(k) = dcvhom
2757  cptot0_t(k) = dcphom
2758 
2759  drhonihom = pq(k,i_nihom) * fac1
2760  rhoq0_t(k,i_ni) = drhonihom
2761  end do
2762 
2763  ! total tendency
2764  do k = ks, ke
2765  rhoe_t(k,i,j) = rhoe_t(k,i,j) + rhoe0_t(k)
2766  cvtot_t(k,i,j) = cvtot_t(k,i,j) + cvtot0_t(k)
2767  cptot_t(k,i,j) = cptot_t(k,i,j) + cptot0_t(k)
2768  enddo
2769 
2770  ! update intermidiate variable
2771  do k = ks, ke
2772  rhoq(k,i_qv) = rhoq(k,i_qv) + rhoq0_t(k,i_qv)*dt
2773  rhoq(k,i_qi) = max(0.0_rp, rhoq(k,i_qi) + rhoq0_t(k,i_qi)*dt )
2774  rhoq(k,i_ni) = max(0.0_rp, rhoq(k,i_ni) + rhoq0_t(k,i_ni)*dt )
2775  enddo
2776 
2777  do k = ks, ke
2778  rhoe(k) = rhoe(k) + rhoe0_t(k)*dt
2779  cva(k) = cva(k) + cvtot0_t(k)*dt
2780  cpa(k) = cpa(k) + cptot0_t(k)*dt
2781 
2782  temp(k) = rhoe(k) / ( dens(k,i,j) * cva(k) )
2783  pres(k) = dens(k,i,j) * (cpa(k)-cva(k)) * temp(k)
2784  wtemp(k) = max( temp(k), tem_min )
2785  enddo
2786 
2787  endif
2788 
2789  ! nucleation
2790  do k = ks, ke
2791  drhoqc = pq(k,i_lcccn)
2792  drhoqi = pq(k,i_liccn)
2793  tmp = - drhoqc - drhoqi
2794  drhoqv = max( - rhoq(k,i_qv) / dt, tmp )
2795 
2796  ! limiting coefficient
2797  fac1 = drhoqv / min( tmp, -eps ) ! drhoqc and drhoqi must be >= 0, otherwise fac1 can be artificially huge value.
2798 
2799  drhoqc = drhoqc * fac1
2800  drhoqi = drhoqi * fac1
2801 
2802  rhoq0_t(k,i_qv) = drhoqv
2803  rhoq0_t(k,i_qc) = drhoqc
2804  rhoq0_t(k,i_qi) = drhoqi
2805 
2806  rhoe0_t(k) = - lhv * drhoqv + lhf * drhoqi
2807 
2808  dqv = rrho(k) * drhoqv
2809  dql = rrho(k) * drhoqc
2810  dqi = rrho(k) * drhoqi
2811 
2812  dcv = cv_vapor * dqv + cv_water * dql + cv_ice * dqi
2813  dcp = cp_vapor * dqv + cp_water * dql + cp_ice * dqi
2814 
2815  cvtot0_t(k) = dcv
2816  cptot0_t(k) = dcp
2817 
2818  drhonc = pq(k,i_ncccn) * fac1
2819  drhoni = pq(k,i_niccn) * fac1
2820  rhoq0_t(k,i_nc) = drhonc
2821  rhoq0_t(k,i_ni) = drhoni
2822  end do
2823 
2824  ! total tendency
2825  do k = ks, ke
2826  rhoe_t(k,i,j) = rhoe_t(k,i,j) + rhoe0_t(k)
2827  cvtot_t(k,i,j) = cvtot_t(k,i,j) + cvtot0_t(k)
2828  cptot_t(k,i,j) = cptot_t(k,i,j) + cptot0_t(k)
2829  enddo
2830 
2831  ! update intermidiate variable
2832  do k = ks, ke
2833  rhoq(k,i_qv) = rhoq(k,i_qv) + rhoq0_t(k,i_qv)*dt
2834  rhoq(k,i_qc) = max(0.0_rp, rhoq(k,i_qc) + rhoq0_t(k,i_qc)*dt )
2835  rhoq(k,i_qi) = max(0.0_rp, rhoq(k,i_qi) + rhoq0_t(k,i_qi)*dt )
2836  rhoq(k,i_nc) = max(0.0_rp, rhoq(k,i_nc) + rhoq0_t(k,i_nc)*dt )
2837  rhoq(k,i_ni) = max(0.0_rp, rhoq(k,i_ni) + rhoq0_t(k,i_ni)*dt )
2838 
2839  ! cloud number concentration filter
2840  rhoq(k,i_nc) = min( rhoq(k,i_nc), nc_uplim_d(1,i,j) )
2841  end do
2842 
2843  do k = ks, ke
2844  rhoe(k) = rhoe(k) + rhoe0_t(k)*dt
2845  cva(k) = cva(k) + cvtot0_t(k)*dt
2846  cpa(k) = cpa(k) + cptot0_t(k)*dt
2847 
2848  temp(k) = rhoe(k) / ( dens(k,i,j) * cva(k) )
2849  pres(k) = dens(k,i,j) * (cpa(k)-cva(k)) * temp(k)
2850  wtemp(k) = max( temp(k), tem_min )
2851  enddo
2852 
2853 
2854 #ifdef DEBUG
2855  call debug_tem( ka, ks, ke, &
2856  2, i, j, temp(:), dens(:,i,j), pres(:), qtrc(:,i,j,i_qv) )
2857 #endif
2858 
2859 
2860  !----------------------------------------------------------------------------
2861  !
2862  ! 2.Phase change: Freezing, Melting, Vapor deposition
2863  !
2864  !----------------------------------------------------------------------------
2865  call get_terminal_velocity( &
2866  ka, ks, ke, &
2867  vt_xa(:,:,:), xq(:,:), & ! (out)
2868  rhoq(:,:), & ! (in)
2869  log_rho_fac_q(:,:) ) ! (in)
2870 
2871  call get_diamiter( &
2872  ka, ks, ke, &
2873  dq_xa(:,:), & ! (out)
2874  xq(:,:) ) ! (in)
2875 
2876  if (flg_lt_l) then
2877  do iq = i_qc, i_qg
2878  do k = ks, ke
2879  rhoq_crg(k,iq) = dens(k,i,j) * qtrc_crg(k,i,j,iq-1)
2880  enddo
2881  enddo
2882  end if
2883 
2884  call moist_psat_liq( ka, ks, ke, &
2885  wtemp(:), esw(:) ) ! [IN], [OUT]
2886  call moist_psat_ice( ka, ks, ke, &
2887  wtemp(:), esi(:) ) ! [IN], [OUT]
2888 
2889  call freezing_water( &
2890  ka, ks, ke, &
2891  dt, & ! (in)
2892  rhoq(:,:), xq(:,:), temp(:), & ! (in)
2893  pq(:,:) ) ! (inout)
2894 
2895  call dep_vapor_melt_ice( &
2896  ka, ks, ke, &
2897  dens(:,i,j), wtemp(:), pres(:), qdry(:,i,j), rhoq(:,:), & ! (in)
2898  esw(:), esi(:), xq(:,:), vt_xa(:,:,:), dq_xa(:,:), & ! (in)
2899  pq(:,:) ) ! (inout)
2900 
2901  !
2902  ! update subroutine
2903  !
2904  call update_by_phase_change( &
2905  ka, ks, ke, &
2906  ntmax_phase_change, dt, & ! (in)
2907  cz(:,i,j), fz(:,i,j), & ! (in)
2908  w(:,i,j), & ! (in)
2909  dtdt_equiv_d(:), & ! (in)
2910  dens(:,i,j), qdry(:,i,j), & ! (in)
2911  esw(:), esi(:), & ! (in)
2912  rhoq(:,:), pres(:), temp(:), & ! (in)
2913  cpa(:), cva(:), & ! (in)
2914  flg_lt_l, & ! (in)
2915  pq(:,:), & ! (inout)
2916  sl_plcdep, sl_plrdep, sl_pnrdep, & ! (inout)
2917  rhoq0_t(:,:), rhoe0_t(:), & ! (out)
2918  cptot0_t(:), cvtot0_t(:), & ! (out)
2919  evaporate(:,i,j), & ! (out)
2920  rhoq_crg(:,:), & ! (in:optional)
2921  rhoqcrg0_t(:,:) ) ! (out:optional)
2922 
2923  ! total tendency
2924  do k = ks, ke
2925  rhoe_t(k,i,j) = rhoe_t(k,i,j) + rhoe0_t(k)
2926  cvtot_t(k,i,j) = cvtot_t(k,i,j) + cvtot0_t(k)
2927  cptot_t(k,i,j) = cptot_t(k,i,j) + cptot0_t(k)
2928  enddo
2929 
2930  ! update intermidiate variable
2931  do iq = 1, qa_mp
2932  do k = ks, ke
2933  rhoq(k,iq) = max(0.0_rp, rhoq(k,iq) + rhoq0_t(k,iq)*dt )
2934  enddo
2935  enddo
2936 
2937  do k = ks, ke
2938  rhoe(k) = rhoe(k) + rhoe0_t(k)*dt
2939  cva(k) = cva(k) + cvtot0_t(k)*dt
2940  cpa(k) = cpa(k) + cptot0_t(k)*dt
2941  temp(k) = rhoe(k) / ( dens(k,i,j) * cva(k) )
2942  pres(k) = dens(k,i,j) * ( cpa(k) - cva(k) ) * temp(k)
2943  enddo
2944 
2945  if (flg_lt_l) then
2946  do iq = i_qc, i_qg
2947  do k = ks, ke
2948  rhoq_crg(k,iq) = rhoq_crg(k,iq) + rhoqcrg0_t(k,iq) * dt ! need limiter?
2949  enddo
2950  enddo
2951  end if
2952 
2953 #ifdef DEBUG
2954  call debug_tem( ka, ks, ke, &
2955  3, i, j, temp(:), dens(:,i,j), pres(:), qtrc(:,i,j,i_qv) )
2956 #endif
2957 
2958  !---------------------------------------------------------------------------
2959  !
2960  ! 3.Collection process
2961  !
2962  !---------------------------------------------------------------------------
2963 
2964  ! parameter setting
2965 
2966  call get_terminal_velocity( &
2967  ka, ks, ke, &
2968  vt_xa(:,:,:), xq(:,:), & ! (out)
2969  rhoq(:,:), & ! (in)
2970  log_rho_fac_q(:,:) ) ! (in)
2971 
2972  ! effective cross section is assume as area equivalent circle
2973  do k = ks, ke
2974  dq_xa(k,i_mp_qc) = 2.0_rp*a_rea(i_mp_qc)*xq(k,i_mp_qc)**b_rea(i_mp_qc)
2975  dq_xa(k,i_mp_qr) = 2.0_rp*a_rea(i_mp_qr)*xq(k,i_mp_qr)**b_rea(i_mp_qr)
2976  dq_xa(k,i_mp_qi) = 2.0_rp*a_rea(i_mp_qi)*xq(k,i_mp_qi)**b_rea(i_mp_qi)
2977  dq_xa(k,i_mp_qs) = 2.0_rp*a_rea(i_mp_qs)*xq(k,i_mp_qs)**b_rea(i_mp_qs)
2978  dq_xa(k,i_mp_qg) = 2.0_rp*a_rea(i_mp_qg)*xq(k,i_mp_qg)**b_rea(i_mp_qg)
2979  end do
2980 
2981  pcrg1(:,:) = 0.0_rp
2982  pcrg2(:,:) = 0.0_rp
2983 
2984  ! Auto-conversion, Accretion, Self-collection, Break-up
2985  if ( mp_doautoconversion ) then
2986  call aut_acc_slc_brk( &
2987  ka, ks, ke, &
2988  flg_lt_l, & ! (in)
2989  rhoq(:,:), & ! (in)
2990  rhoq_crg(:,:), & ! (in)
2991  xq(:,:), dq_xa(:,:), & ! (in)
2992  dens(:,i,j), & ! (in)
2993  pq(:,:), & ! (in)
2994  pcrg1(:,:) ) ! (inout)
2995 
2996  else
2997 !OCL XFILL
2998  do k = ks, ke
2999  pq(k,i_lcaut) = 0.0_rp
3000  pq(k,i_ncaut) = 0.0_rp
3001  pq(k,i_nraut) = 0.0_rp
3002  pq(k,i_lcacc) = 0.0_rp
3003  pq(k,i_ncacc) = 0.0_rp
3004  pq(k,i_nrslc) = 0.0_rp
3005  pq(k,i_nrbrk) = 0.0_rp
3006  !--- for lightning
3007  pcrg1(k,i_lcaut) = 0.0_rp
3008  pcrg1(k,i_ncaut) = 0.0_rp
3009  pcrg1(k,i_nraut) = 0.0_rp
3010  pcrg1(k,i_lcacc) = 0.0_rp
3011  pcrg1(k,i_ncacc) = 0.0_rp
3012  pcrg1(k,i_nrslc) = 0.0_rp
3013  pcrg1(k,i_nrbrk) = 0.0_rp
3014  end do
3015  endif
3016 
3017  if ( flg_lt_l ) then
3018  do k = ks, ke
3019  beta_crg_l(k) = beta_crg(k,i,j)
3020  dqcrg_l(k) = dqcrg(k,i,j)
3021  end do
3022  end if
3023 
3024  ! collection process
3025  if( opt_collection_bin ) then
3027  ka, ks, ke, & ! (in)
3028  flg_lt_l, & ! (in)
3029  d0_crg_l, v0_crg_l, & ! (in)
3030  beta_crg_l(:), dqcrg_l(:), & ! (in)
3031  temp(:), rhoq(:,:), & ! (in)
3032  rhoq_crg(:,:), & ! (in)
3033  xq(:,:), dq_xa(:,:), vt_xa(:,:,:), & ! (in)
3034  dens(:,i,j), & ! (in)
3035  pq(:,:), & ! (inout)
3036  pcrg1(:,:), & ! (inout)
3037  pcrg2(:,:), & ! (inout)
3038  pac(:,:) ) ! (out)
3039  else
3040  call mixed_phase_collection( &
3041  ka, ks, ke, & ! (in)
3042  flg_lt_l, & ! (in)
3043  d0_crg_l, v0_crg_l, & ! (in)
3044  beta_crg_l(:), dqcrg_l(:), & ! (in)
3045  temp(:), rhoq(:,:), & ! (in)
3046  rhoq_crg(:,:), & ! (in)
3047  xq(:,:), dq_xa(:,:), vt_xa(:,:,:), & ! (in)
3048  pq(:,:), & ! (inout)
3049  pcrg1(:,:), & ! (inout)
3050  pcrg2(:,:), & ! (inout)
3051  pac(:,:) ) ! (out)
3052  endif
3053 
3054 
3055  call ice_multiplication( &
3056  ka, ks, ke, & ! (in)
3057  flg_lt_l, & ! (in)
3058  pac(:,:), & ! (in)
3059  temp(:), rhoq(:,:), & ! (in)
3060  rhoq_crg(:,:), & ! (in)
3061  xq(:,:), & ! (in)
3062  pq(:,:), & ! (inout)
3063  pcrg1(:,:) ) ! (inout)
3064 
3065  !
3066  ! update
3067  !
3068 !OCL LOOP_FISSION_TARGET(LS)
3069  do k = ks, ke
3070  ! warm collection process
3071  wrm_dqc = max( dt*( pq(k,i_lcaut)+pq(k,i_lcacc) ), -rhoq(k,i_qc) )
3072  wrm_dnc = max( dt*( pq(k,i_ncaut)+pq(k,i_ncacc) ), -rhoq(k,i_nc) )
3073  wrm_dnr = max( dt*( pq(k,i_nraut)+pq(k,i_nrslc)+pq(k,i_nrbrk) ), -rhoq(k,i_nr) )
3074  wrm_dqr = -wrm_dqc
3075 
3076  ! mixed phase collection
3077  ! Pxxacyy2zz xx and yy decrease and zz increase .
3078  !
3079  ! At first fixer is applied to decreasing particles.
3080  ! order of fixer: graupel-cloud, snow-cloud, ice-cloud, graupel-rain, snow-rain, ice-rain,
3081  ! snow-ice, ice-ice, graupel-snow, snow-snow
3082  ! cloud mass decrease
3083  gc_dqc = max( dt*pac(k,i_lgaclc2lg), min(0.0_rp, -rhoq(k,i_qc)-wrm_dqc )) ! => dqg
3084  sc_dqc = max( dt*pac(k,i_lsaclc2ls), min(0.0_rp, -rhoq(k,i_qc)-wrm_dqc-gc_dqc )) ! => dqs
3085  ic_dqc = max( dt*pac(k,i_liaclc2li), min(0.0_rp, -rhoq(k,i_qc)-wrm_dqc-gc_dqc-sc_dqc )) ! => dqi
3086  ! cloud num. decrease
3087  gc_dnc = max( dt*pac(k,i_ngacnc2ng), min(0.0_rp, -rhoq(k,i_nc)-wrm_dnc )) ! => dnc:minus
3088  sc_dnc = max( dt*pac(k,i_nsacnc2ns), min(0.0_rp, -rhoq(k,i_nc)-wrm_dnc-gc_dnc )) ! => dnc:minus
3089  ic_dnc = max( dt*pac(k,i_niacnc2ni), min(0.0_rp, -rhoq(k,i_nc)-wrm_dnc-gc_dnc-sc_dnc )) ! => dnc:minus
3090 
3091  ! rain mass decrease ( tem < 273.15K)
3092  sw = sign(0.5_rp, t00-temp(k)) + 0.5_rp ! if( temp(k,i,j) <= T00 )then sw=1, else sw=0
3093  rg_dqr = max( dt*pac(k,i_lraclg2lg ), min(0.0_rp, -rhoq(k,i_qr)-wrm_dqr )) * sw
3094  rg_dqg = max( dt*pac(k,i_lraclg2lg ), min(0.0_rp, -rhoq(k,i_qg) )) * ( 1.0_rp - sw )
3095  rs_dqr = max( dt*pac(k,i_lracls2lg_r), min(0.0_rp, -rhoq(k,i_qr)-wrm_dqr-rg_dqr )) * sw
3096  ri_dqr = max( dt*pac(k,i_lracli2lg_r), min(0.0_rp, -rhoq(k,i_qr)-wrm_dqr-rg_dqr-rs_dqr )) * sw
3097 
3098  ! rain num. decrease
3099  rg_dnr = max( dt*pac(k,i_nracng2ng ), min(0.0_rp, -rhoq(k,i_nr)-wrm_dnr )) * sw
3100  rg_dng = max( dt*pac(k,i_nracng2ng ), min(0.0_rp, -rhoq(k,i_ng) )) * ( 1.0_rp - sw )
3101  rs_dnr = max( dt*pac(k,i_nracns2ng_r), min(0.0_rp, -rhoq(k,i_nr)-wrm_dnr-rg_dnr )) * sw
3102  ri_dnr = max( dt*pac(k,i_nracni2ng_r), min(0.0_rp, -rhoq(k,i_nr)-wrm_dnr-rg_dnr-rs_dnr )) * sw
3103 
3104  ! ice mass decrease
3105  fac1 = (ri_dqr-eps)/ (dt*pac(k,i_lracli2lg_r)-eps) ! suppress factor by filter of rain
3106  ri_dqi = max( dt*pac(k,i_lracli2lg_i)*fac1, min(0.0_rp, -rhoq(k,i_qi)+ic_dqc )) ! => dqg
3107  ii_dqi = max( dt*pac(k,i_liacli2ls ) , min(0.0_rp, -rhoq(k,i_qi)+ic_dqc-ri_dqi )) ! => dqs
3108  is_dqi = max( dt*pac(k,i_liacls2ls ) , min(0.0_rp, -rhoq(k,i_qi)+ic_dqc-ri_dqi-ii_dqi )) ! => dqs
3109 !! !-- Y.Sato added(2018/8/31)
3110 !! gi_dqi = max( dt*Pac(k,I_LGacLI2LG) , min(0.0_RP, -rhoq(k,I_QI)+ic_dqc-ri_dqi-ii_dqi-is_dqi )) ! => dqg
3111 
3112  ! ice num. decrease
3113  fac4(k) = (ri_dnr-eps)/ (dt*pac(k,i_nracni2ng_r)-eps) ! suppress factor by filter of rain
3114  ri_dni = max( dt*pac(k,i_nracni2ng_i)*fac4(k), min(0.0_rp, -rhoq(k,i_ni) )) ! => dni:minus
3115  ii_dni = max( dt*pac(k,i_niacni2ns ) , min(0.0_rp, -rhoq(k,i_ni)-ri_dni )) ! => dni:minus,dns:plus(*0.5)
3116  is_dni = max( dt*pac(k,i_niacns2ns ) , min(0.0_rp, -rhoq(k,i_ni)-ri_dni-ii_dni )) ! => dni:minus,dns:plus
3117 !! !-- Y.Sato added(2018/8/31)
3118 !! gi_dni = max( dt*Pac(k,I_NGacNI2NG) , min(0.0_RP, -rhoq(k,I_NI)-ri_dni-ii_dni-is_dni )) ! => dns:minus
3119 
3120  ! snow mass decrease
3121  fac3 = (rs_dqr-eps)/(dt*pac(k,i_lracls2lg_r)-eps) ! suppress factor by filter of rain
3122  rs_dqs = max( dt*pac(k,i_lracls2lg_s)*fac3, min(0.0_rp, -rhoq(k,i_qs)+sc_dqc+ii_dqi+is_dqi )) ! => dqg
3123  gs_dqs = max( dt*pac(k,i_lgacls2lg ) , min(0.0_rp, -rhoq(k,i_qs)+sc_dqc+ii_dqi+is_dqi-rs_dqs )) ! => dqg
3124  ! snow num. decrease
3125  fac6(k) = (rs_dnr-eps)/(dt*pac(k,i_nracns2ng_r)-eps) ! suppress factor by filter of rain
3126  ! fac7 = (is_dni-eps)/(dt*Pac(I_NIacNS2NS, k,i,j)-eps) ! suppress factor by filter of ice
3127  rs_dns = max( dt*pac(k,i_nracns2ng_s)*fac6(k), min(0.0_rp, -rhoq(k,i_ns)+0.50_rp*ii_dni+is_dni )) ! => dns:minus
3128  gs_dns = max( dt*pac(k,i_ngacns2ng ) , min(0.0_rp, -rhoq(k,i_ns)+0.50_rp*ii_dni+is_dni-rs_dns )) ! => dns:minus
3129  ss_dns = max( dt*pac(k,i_nsacns2ns ) , min(0.0_rp, -rhoq(k,i_ns)+0.50_rp*ii_dni+is_dni-rs_dns-gs_dns ))
3130  gg_dng = max( dt*pac(k,i_ngacng2ng ) , min(0.0_rp, -rhoq(k,i_ng) ))
3131 
3132  ! total plus in mixed phase collection(clp_)
3133  ! mass
3134  ! if( temp(k,i,j) <= T00 )then sw=1, else sw=0
3135  clp_dqc = 0.0_rp
3136  clp_dqr = (-rg_dqg-rs_dqs-ri_dqi) * (1.0_rp-sw)
3137  clp_dqi = -ic_dqc
3138  clp_dqs = -sc_dqc-ii_dqi-is_dqi
3139  clp_dqg = -gc_dqc -gs_dqs + (-rg_dqr-rs_dqr-rs_dqs-ri_dqr-ri_dqi) * sw
3140  ! num.( number only increase when a+b=>c, dnc=-dna)
3141  clp_dnc = 0.0_rp
3142  clp_dnr = 0.0_rp
3143  clp_dni = 0.0_rp
3144  clp_dns = -ii_dni*0.5_rp
3145  clp_dng = (-rs_dnr-ri_dnr) * sw
3146 
3147  ! total minus in mixed phase collection(clm_)
3148  ! mass
3149  clm_dqc = gc_dqc+sc_dqc+ic_dqc
3150  clm_dqr = (rg_dqr+rs_dqr+ri_dqr) * sw
3151  clm_dqi = ri_dqi+ii_dqi+is_dqi
3152  clm_dqs = rs_dqs+gs_dqs
3153  clm_dqg = rg_dqg * (1.0_rp-sw)
3154  ! num.
3155  clm_dnc = gc_dnc+sc_dnc+ic_dnc
3156  clm_dnr = (rg_dnr+rs_dnr+ri_dnr) * sw
3157  clm_dni = ri_dni+ii_dni+is_dni
3158  clm_dns = rs_dns+ss_dns+gs_dns
3159  clm_dng = gg_dng + rg_dng * (1.0_rp-sw)
3160 
3161  ! partial conversion
3162  ! 08/05/08 [Mod] T.Mitsui
3163  pco_dqi = max( dt*pq(k,i_licon), -clp_dqi )
3164  pco_dqs = max( dt*pq(k,i_lscon), -clp_dqs )
3165  pco_dqg = -pco_dqi-pco_dqs
3166  ! 08/05/08 [Mod] T.Mitsui
3167  pco_dni = max( dt*pq(k,i_nicon), -clp_dni )
3168  pco_dns = max( dt*pq(k,i_nscon), -clp_dns )
3169  pco_dng = -pco_dni-pco_dns
3170 
3171  ! enhanced melting ( always negative value )
3172  ! ice-cloud melting produces cloud, others produce rain
3173  eml_dqi = max( dt*pq(k,i_liacm), min(0.0_rp, -rhoq(k,i_qi)-(clp_dqi+clm_dqi)-pco_dqi ))
3174  eml_dqs = max( dt*pq(k,i_lsacm), min(0.0_rp, -rhoq(k,i_qs)-(clp_dqs+clm_dqs)-pco_dqs ))
3175  eml_dqg = max( dt*(pq(k,i_lgacm)+pq(k,i_lgarm)+pq(k,i_lsarm)+pq(k,i_liarm)), &
3176  min(0.0_rp, -rhoq(k,i_qg)-(clp_dqg+clm_dqg)-pco_dqg ))
3177  eml_dqc = -eml_dqi
3178  eml_dqr = -eml_dqs-eml_dqg
3179  !
3180  eml_dni = max( dt*pq(k,i_niacm), min(0.0_rp, -rhoq(k,i_ni)-(clp_dni+clm_dni)-pco_dni ))
3181  eml_dns = max( dt*pq(k,i_nsacm), min(0.0_rp, -rhoq(k,i_ns)-(clp_dns+clm_dns)-pco_dns ))
3182  eml_dng = max( dt*(pq(k,i_ngacm)+pq(k,i_ngarm)+pq(k,i_nsarm)+pq(k,i_niarm)), &
3183  min(0.0_rp, -rhoq(k,i_ng)-(clp_dng+clm_dng)-pco_dng ))
3184  eml_dnc = -eml_dni
3185  eml_dnr = -eml_dns-eml_dng
3186 
3187  ! ice multiplication
3188  spl_dqg = max( dt*pq(k,i_lgspl), min(0.0_rp, -rhoq(k,i_qg)-(clp_dqg+clm_dqg)-pco_dqg-eml_dqg ))
3189  spl_dqs = max( dt*pq(k,i_lsspl), min(0.0_rp, -rhoq(k,i_qs)-(clp_dqs+clm_dqs)-pco_dqs-eml_dqs ))
3190  spl_dqi = -spl_dqg-spl_dqs
3191  fac9(k) = (spl_dqg-eps)/(dt*pq(k,i_lgspl)-eps) * (spl_dqs-eps)/(dt*pq(k,i_lsspl)-eps)
3192  spl_dni = dt*pq(k,i_nispl)*fac9(k)
3193 
3194  !
3195  ! melting and freezing limiter
3196  di2l = clp_dqc + clp_dqr + clm_dqc + clm_dqr + eml_dqc + eml_dqr ! = - ( clp_dqi + clp_dqs + clp_dqg + clm_dqi + clm_dqs + clm_dqg + eml_dqi + eml_dqs + eml_dqg )
3197  dtem = - di2l * lhf0 / ( cva(k) * dens(k,i,j) )
3198  if ( abs(dtem) < eps ) then
3199  fact(k) = 1.0_rp
3200  else
3201  fact(k) = min( 1.0_rp, max( 0.0_rp, ( t00 - temp(k) ) / dtem ) )
3202  end if
3203 
3204  !
3205  ! total cloud change
3206  drhoqc = wrm_dqc + ( clp_dqc + clm_dqc + eml_dqc ) * fact(k)
3207  drhonc = wrm_dnc + ( clp_dnc + clm_dnc + eml_dnc ) * fact(k)
3208  ! total rain change
3209  drhoqr = wrm_dqr + ( clp_dqr + clm_dqr + eml_dqr ) * fact(k)
3210  drhonr = wrm_dnr + ( clp_dnr + clm_dnr + eml_dnr ) * fact(k)
3211  ! total ice change
3212  drhoqi = ( clp_dqi + clm_dqi + eml_dqi ) * fact(k) + pco_dqi + spl_dqi
3213  drhoni = ( clp_dni + clm_dni + eml_dni ) * fact(k) + pco_dni + spl_dni
3214  ! total snow change
3215  drhoqs = ( clp_dqs + clm_dqs + eml_dqs ) * fact(k) + pco_dqs + spl_dqs
3216  drhons = ( clp_dns + clm_dns + eml_dns ) * fact(k) + pco_dns
3217  ! total graupel change
3218  drhoqg = ( clp_dqg + clm_dqg + eml_dqg ) * fact(k) + pco_dqg + spl_dqg
3219  drhong = ( clp_dng + clm_dng + eml_dng ) * fact(k) + pco_dng
3220 
3221  ! tendency
3222  rhoq0_t(k,i_qc) = drhoqc / dt
3223  rhoq0_t(k,i_nc) = drhonc / dt
3224  rhoq0_t(k,i_qr) = drhoqr / dt
3225  rhoq0_t(k,i_nr) = drhonr / dt
3226  rhoq0_t(k,i_qi) = drhoqi / dt
3227  rhoq0_t(k,i_ni) = drhoni / dt
3228  rhoq0_t(k,i_qs) = drhoqs / dt
3229  rhoq0_t(k,i_ns) = drhons / dt
3230  rhoq0_t(k,i_qg) = drhoqg / dt
3231  rhoq0_t(k,i_ng) = drhong / dt
3232 
3233  rhoe0_t(k) = lhf * ( drhoqi + drhoqs + drhoqg ) / dt
3234 
3235  dql = rrho(k) * ( drhoqc + drhoqr )
3236  dqi = rrho(k) * ( drhoqi + drhoqs + drhoqg )
3237 
3238  dcv = cv_water * dql + cv_ice * dqi
3239  dcp = cp_water * dql + cp_ice * dqi
3240 
3241  cvtot0_t(k) = dcv / dt
3242  cptot0_t(k) = dcp / dt
3243 
3244 
3245  enddo
3246 
3247  ! total tendency
3248  do k = ks, ke
3249  rhoe_t(k,i,j) = rhoe_t(k,i,j) + rhoe0_t(k)
3250  cvtot_t(k,i,j) = cvtot_t(k,i,j) + cvtot0_t(k)
3251  cptot_t(k,i,j) = cptot_t(k,i,j) + cptot0_t(k)
3252  enddo
3253 
3254  !--- update
3255  do iq = i_qc, i_ng
3256  do k = ks, ke
3257  rhoq(k,iq) = max(0.0_rp, rhoq(k,iq) + rhoq0_t(k,iq) * dt )
3258  enddo
3259  enddo
3260 
3261  ! total tendency
3262  do iq = i_qv, i_ng
3263  do k = ks, ke
3264  rhoq_t(k,i,j,iq) = ( rhoq(k,iq) - dens(k,i,j)*qtrc(k,i,j,iq) )/dt
3265  enddo
3266  enddo
3267 
3268  do ip = 1, w_nmax
3269  if ( hist_sw(ip) ) then
3270  if(ip <= pq_max) then
3271  do k = ks, ke
3272  w3d(k,i,j,hist_idx(ip)) = pq(k,ip)
3273  end do
3274  else
3275  do k = ks, ke
3276  w3d(k,i,j,hist_idx(ip)) = pac(k,ip-pq_max)
3277  end do
3278  endif
3279  end if
3280  enddo
3281 
3282  !--- for lithgning component
3283  if ( flg_lt_l ) then
3284 
3285 !OCL LOOP_FISSION_TARGET(LS)
3286  do k = ks, ke
3287  sw = sign(0.5_rp, t00-temp(k)) + 0.5_rp ! if( temp(k,i,j) <= T00 )then sw=1, else sw=0
3288 
3289  wrm_dnc_crg = dt*( pcrg1(k,i_ncaut)+pcrg1(k,i_ncacc) ) ! C + C -> R
3290  !--- limiter
3291  sw1 = min( abs(rhoq_crg(k,i_qc)),abs(wrm_dnc_crg) )
3292  wrm_dnc_crg = sign( sw1,wrm_dnc_crg )
3293  wrm_dnr_crg = - wrm_dnc_crg
3294 
3295  ! Decrease of absolute value of cloud charge density
3296  gc_dnc_crg = dt*pcrg2(k,i_ngacnc2ng) ! C + G -> G ( move from c to g )
3297  sc_dnc_crg = dt*pcrg2(k,i_nsacnc2ns) ! C + S -> S ( move from c to s )
3298  ic_dnc_crg = dt*pcrg2(k,i_niacnc2ni) ! C + I -> I ( move from c to i )
3299  !--- limiter
3300  sw1 = min( abs(rhoq_crg(k,i_qc)+wrm_dnc_crg ),abs(gc_dnc_crg) )
3301  gc_dnc_crg = sign( sw1,gc_dnc_crg )
3302  sw1 = min( abs(rhoq_crg(k,i_qc)+wrm_dnc_crg+gc_dnc_crg ),abs(sc_dnc_crg) )
3303  sc_dnc_crg = sign( sw1,sc_dnc_crg )
3304  sw1 = min( abs(rhoq_crg(k,i_qc)+wrm_dnc_crg+gc_dnc_crg+sc_dnc_crg),abs(ic_dnc_crg) )
3305  ic_dnc_crg = sign( sw1,ic_dnc_crg )
3306 
3307  ! Decrease of absolute value of rain charge density
3308  rg_dnr_crg = dt*pcrg2(k,i_nracng2ng )* sw ! R + G -> G
3309  rg_dng_crg = dt*pcrg2(k,i_nracng2ng )* ( 1.0_rp - sw ) ! R + G -> R
3310  rs_dnr_crg = dt*pcrg2(k,i_nracns2ng_r)* sw ! R + S -> G
3311  ri_dnr_crg = dt*pcrg2(k,i_nracni2ng_r)* sw ! R + I -> G
3312  !--- limiter
3313  sw1 = min( abs(rhoq_crg(k,i_qr)+wrm_dnr_crg),abs(rg_dnr_crg) )
3314  rg_dnr_crg = sign( sw1,rg_dnr_crg )
3315  sw1 = min( abs(rhoq_crg(k,i_qg) ),abs(rg_dng_crg) )
3316  rg_dng_crg = sign( sw1,rg_dng_crg )
3317  sw1 = min( abs(rhoq_crg(k,i_qr)+wrm_dnr_crg),abs(rs_dnr_crg) )
3318  rs_dnr_crg = sign( sw1,rs_dnr_crg )
3319  sw1 = min( abs(rhoq_crg(k,i_qr)+wrm_dnr_crg),abs(ri_dnr_crg) )
3320  ri_dnr_crg = sign( sw1,ri_dnr_crg )
3321 
3322  ! Decrease of absolute value of ice charge density
3323  ri_dni_crg = dt*pcrg2(k,i_nracni2ng_i)*fac4(k) ! I + R -> G
3324  ii_dni_crg = dt*pcrg2(k,i_niacni2ns) ! I + I -> S
3325  is_dni_crg = dt*pcrg2(k,i_niacns2ns) ! I + S -> S
3326 !! !-- Y.Sato added(2018/8/31)
3327 !! gi_dni_crg = dt*Pcrg2(k,I_NGacNI2NG) ! G + S -> G
3328  !--- limiter
3329  sw1 = min( abs(rhoq_crg(k,i_qi)-ic_dnc_crg) ,abs(ri_dni_crg) )
3330  ri_dni_crg = sign( sw1,ri_dni_crg )
3331  sw1 = min( abs(rhoq_crg(k,i_qi)-ic_dnc_crg+ri_dni_crg) ,abs(ii_dni_crg) )
3332  ii_dni_crg = sign( sw1,ii_dni_crg )
3333  sw1 = min( abs(rhoq_crg(k,i_qi)-ic_dnc_crg+ri_dni_crg+ii_dni_crg),abs(is_dni_crg) )
3334  is_dni_crg = sign( sw1,is_dni_crg )
3335 !! !-- Y.Sato added(2018/8/31)
3336 !! sw1 = min( abs(rhoq_crg(k,I_QI)-ic_dnc_crg+ri_dni_crg+ii_dni_crg+is_dni_crg),abs(gi_dni_crg) )
3337 !! gi_dni_crg = sign( sw1,gi_dni_crg )
3338 
3339  ! Decrease of absolute value of snow charge density
3340  rs_dns_crg = dt*pcrg2(k,i_nracns2ng_s)*fac6(k) ! R + S -> G
3341  gs_dns_crg = dt*pcrg2(k,i_ngacns2ng) ! G + S -> G
3342  ss_dns_crg = 0.0_rp ! S + S -> S (No charge transfer)
3343  gg_dng_crg = 0.0_rp ! G + G -> G (No charge transfer)
3344  !--- limiter
3345  sw1 = min( abs(rhoq_crg(k,i_qs)-sc_dnc_crg-ii_dni_crg-is_dni_crg), abs(rs_dns_crg) )
3346  rs_dns_crg = sign( sw1,rs_dns_crg )
3347  sw1 = min( abs(rhoq_crg(k,i_qs)-sc_dnc_crg-ii_dni_crg-is_dni_crg+rs_dns_crg),abs(gs_dns_crg) )
3348  gs_dns_crg = sign( sw1,gs_dns_crg )
3349  !--- Charge split
3350  sw1 = sign(0.5_rp, abs( pcrg2(k,i_cgngacns2ng) )-eps ) + 0.5_rp ! if abs Pcrg2 is smaller than EPS, sw=1, else sw=0
3351  sw2 = sign(0.5_rp, abs( pcrg2(k,i_cgngacni2ng) )-eps ) + 0.5_rp ! if abs Pcrg2 is smaller than EPS, sw=1, else sw=0
3352  crg_split_g = dt*pcrg2(k,i_cgngacns2ng)*sw1 &
3353  + dt*pcrg2(k,i_cgngacni2ng)*sw2
3354  crg_split_s = -dt*pcrg2(k,i_cgngacns2ng)*sw1
3355  crg_split_i = 0.0_rp
3356 !! crg_split_i = -dt*Pcrg2(k,I_CGNGacNI2NG)*sw2 !Y.Sato (2018/8/31)
3357  qsplt_in(k,i,j,1) = crg_split_g / dt ! fC/s
3358  qsplt_in(k,i,j,3) = crg_split_s / dt ! fC/s
3359  qsplt_in(k,i,j,2) = crg_split_i / dt ! fC/s
3360 
3361  ! Decrease of absolute value of graupel charge density
3362  clp_dnc_crg = 0.0_rp
3363  clp_dnr_crg = -rg_dng_crg*(1.0_rp-sw)
3364  clp_dni_crg = -ic_dnc_crg !&
3365 !! +crg_split_i ! Y.Sato added (2018/8/31)
3366  clp_dns_crg = -sc_dnc_crg-ii_dni_crg-is_dni_crg-ss_dns_crg &
3367  +crg_split_s
3368  clp_dng_crg = -gc_dnc_crg+(-rg_dnr_crg-rs_dnr_crg-ri_dnr_crg)*sw &
3369  -ri_dni_crg-rs_dns_crg-gs_dns_crg-gg_dng_crg &
3370 !! -gi_dni_crg & !--- Y.Sato (2018/8/31)
3371  +crg_split_g
3372 
3373  clm_dnc_crg = gc_dnc_crg+sc_dnc_crg+ic_dnc_crg
3374  clm_dnr_crg = (rg_dnr_crg+rs_dnr_crg+ri_dnr_crg) * sw
3375  clm_dni_crg = ri_dni_crg+ii_dni_crg+is_dni_crg !!&
3376 !! + gi_dni_crg !Y.Sato (2018/8/31)
3377  clm_dns_crg = rs_dns_crg+gs_dns_crg+ss_dns_crg
3378  clm_dng_crg = gg_dng_crg+rg_dng_crg*(1.0_rp-sw)
3379 
3380  pco_dni_crg = dt*pcrg1(k,i_nicon)
3381  pco_dns_crg = dt*pcrg1(k,i_nscon)
3382  !--- limiter
3383  sw1 = min( abs(rhoq_crg(k,i_qi)+clp_dni_crg ),abs(pco_dni_crg) )
3384  pco_dni_crg = sign( sw1,pco_dni_crg )
3385  sw1 = min( abs(rhoq_crg(k,i_qs)+clp_dns_crg ),abs(pco_dns_crg) )
3386  pco_dns_crg = sign( sw1,pco_dns_crg )
3387  pco_dng_crg = -pco_dni_crg-pco_dns_crg
3388 
3389  eml_dni_crg = dt*pcrg1(k,i_niacm) ! I+C->C
3390  eml_dns_crg = dt*pcrg1(k,i_nsacm) ! S+C->R
3391  eml_dng_crg = dt*(pcrg1(k,i_ngacm)+pcrg1(k,i_ngarm)+pcrg1(k,i_nsarm)+pcrg1(k,i_niarm)) ! G+R->R, G+C->R
3392  !--- limiter
3393  sw1 = min( abs(rhoq_crg(k,i_qi)+clp_dni_crg+clm_dni_crg+pco_dni_crg ),abs(eml_dni_crg) )
3394  eml_dni_crg = sign( sw1,eml_dni_crg )
3395  sw1 = min( abs(rhoq_crg(k,i_qs)+clp_dns_crg+clm_dns_crg+pco_dns_crg ),abs(eml_dns_crg) )
3396  eml_dns_crg = sign( sw1,eml_dns_crg )
3397  sw1 = min( abs(rhoq_crg(k,i_qg)+clp_dng_crg+clm_dng_crg+pco_dng_crg ),abs(eml_dng_crg) )
3398  eml_dng_crg = sign( sw1,eml_dng_crg )
3399 
3400  eml_dnc_crg = -eml_dni_crg
3401  eml_dnr_crg = -eml_dns_crg-eml_dng_crg
3402 
3403  spl_dns_crg = dt*pcrg1(k,i_nsspl)*fac9(k)
3404  spl_dng_crg = dt*pcrg1(k,i_ngspl)*fac9(k)
3405  !--- limiter
3406  sw1 = min( abs(rhoq_crg(k,i_qs)+clp_dns_crg+pco_dns_crg+eml_dns_crg ),abs(spl_dns_crg) )
3407  spl_dns_crg = sign( sw1,spl_dns_crg )
3408  sw1 = min( abs(rhoq_crg(k,i_qg)+clp_dng_crg+pco_dng_crg+eml_dng_crg ),abs(spl_dng_crg) )
3409  spl_dng_crg = sign( sw1,spl_dng_crg )
3410  spl_dni_crg = -spl_dns_crg-spl_dng_crg
3411 
3412  drhoqcrg_c = wrm_dnc_crg + ( clp_dnc_crg + clm_dnc_crg + eml_dnc_crg ) * fact(k)
3413  drhoqcrg_r = wrm_dnr_crg + ( clp_dnr_crg + clm_dnr_crg + eml_dnr_crg ) * fact(k)
3414  drhoqcrg_i = ( clp_dni_crg + clm_dni_crg + eml_dni_crg ) * fact(k) + pco_dni_crg + spl_dni_crg
3415  drhoqcrg_s = ( clp_dns_crg + clm_dns_crg + eml_dns_crg ) * fact(k) + pco_dns_crg + spl_dns_crg
3416  drhoqcrg_g = ( clp_dng_crg + clm_dng_crg + eml_dng_crg ) * fact(k) + pco_dng_crg + spl_dng_crg
3417 
3418  rhoqcrg0_t(k,i_qc) = drhoqcrg_c / dt
3419  rhoqcrg0_t(k,i_qr) = drhoqcrg_r / dt
3420  rhoqcrg0_t(k,i_qi) = drhoqcrg_i / dt
3421  rhoqcrg0_t(k,i_qs) = drhoqcrg_s / dt
3422  rhoqcrg0_t(k,i_qg) = drhoqcrg_g / dt
3423  end do
3424 
3425 
3426  do iq = i_qc, i_qg
3427  do k = ks, ke
3428  rhoq_crg(k,iq) = rhoq_crg(k,iq) + rhoqcrg0_t(k,iq) * dt !-- need limiter?
3429  enddo
3430  enddo
3431 
3432  do iq = i_qc, i_ng
3433  do k = ks, ke
3434  qtrc0(k,iq) = rhoq(k,iq) / dens(k,i,j)
3435  enddo
3436  enddo
3437  call cross_section( ka, ks, ke, & ! [IN]
3438  qa_mp, & ! [IN]
3439  qtrc0(:,:), & ! [IN]
3440  dens(:,i,j), & ! [IN]
3441  crs(:,:) ) ! [OUT]
3442 
3443  do k = ks, ke
3444  sarea(k,i,j,i_mp_qc) = crs(k,i_mp_qc)
3445  sarea(k,i,j,i_mp_qr) = crs(k,i_mp_qr)
3446  sarea(k,i,j,i_mp_qi) = crs(k,i_mp_qi)
3447  sarea(k,i,j,i_mp_qs) = crs(k,i_mp_qs)
3448  sarea(k,i,j,i_mp_qg) = crs(k,i_mp_qg)
3449  enddo
3450 
3451  do iq = i_qc, i_qg
3452  do k = ks, ke
3453  rhoqcrg_t_mp(k,i,j,iq-1) = ( rhoq_crg(k,iq) - dens(k,i,j)*qtrc_crg(k,i,j,iq-1) ) / dt
3454  enddo
3455  enddo
3456 
3457  end if
3458 
3459 #ifdef DEBUG
3460  call debug_tem( ka, ks, ke, &
3461  4, i, j, temp(:), dens(:,i,j), pres(:), qtrc(:,i,j,i_qv) )
3462 #endif
3463 
3464  end do
3465  end do
3466 
3467  do ip = 1, w_nmax
3468  if ( hist_sw(ip) ) call file_history_put( hist_id(ip), w3d(:,:,:,hist_idx(ip)) )
3469  enddo
3470 
3471  return
3472  end subroutine mp_sn14
3473 
3474  !-----------------------------------------------------------------------------
3475 !OCL SERIAL
3476  subroutine debug_tem( &
3477  KA, KS, KE, &
3478  point, i, j, &
3479  tem, rho, pre, qv )
3480  use scale_prc, only: &
3481  prc_myrank
3482  implicit none
3483  integer, intent(in) :: KA, KS, KE
3484 
3485  integer, intent(in) :: point
3486  integer, intent(in) :: i, j
3487  real(RP), intent(in) :: tem(KA)
3488  real(RP), intent(in) :: rho(KA)
3489  real(RP), intent(in) :: pre(KA)
3490  real(RP), intent(in) :: qv (KA)
3491 
3492  integer :: k
3493  !---------------------------------------------------------------------------
3494 
3495  do k = ks, ke
3496  if ( tem(k) < tem_min &
3497  .OR. rho(k) < rho_min &
3498  .OR. pre(k) < 1.0_rp ) then
3499 
3500  log_info("ATMOS_PHY_MP_SN14_debug_tem_kij",'(A,I3,A,4(F16.5),3(I6))') &
3501  "point: ", point, " low tem,rho,pre:", tem(k), rho(k), pre(k), qv(k), k, i, j, prc_myrank
3502  endif
3503  enddo
3504 
3505  return
3506  end subroutine debug_tem
3507 
3508 !OCL SERIAL
3509  subroutine nucleation( &
3510  KA, KS, KE, &
3511  cz, fz, w, &
3512  rho, tem, pre, qdry, &
3513  rhoq, cpa, cva, &
3514  dTdt_rad, &
3515  qke, &
3516  CCN, nc_uplim_d, &
3517  dt, &
3518  dq_xa, vt_xa, &
3519  PQ )
3520  use scale_prc, only: &
3521  prc_abort
3522  use scale_atmos_saturation, only: &
3523  moist_psat_liq => atmos_saturation_psat_liq, &
3524  moist_psat_ice => atmos_saturation_psat_ice, &
3525  moist_pres2qsat_liq => atmos_saturation_pres2qsat_liq, &
3526  moist_pres2qsat_ice => atmos_saturation_pres2qsat_ice, &
3527  moist_dqsi_dtem_dens => atmos_saturation_dqs_dtem_dens_liq, &
3528  moist_dqs_dtem_dpre_ice => atmos_saturation_dqs_dtem_dpre_ice
3529  use scale_atmos_hydrometeor, only: &
3530  cv_vapor, &
3531  cv_ice
3532  implicit none
3533 
3534  integer, intent(in) :: KA, KS, KE
3535 
3536  real(RP), intent(in) :: cz( KA)
3537  real(RP), intent(in) :: fz(0:KA)
3538  real(RP), intent(in) :: w (KA) ! w of full level
3539  real(RP), intent(in) :: rho (KA)
3540  real(RP), intent(in) :: tem (KA)
3541  real(RP), intent(in) :: pre (KA)
3542  real(RP), intent(in) :: qdry(KA)
3543  !
3544  real(RP), intent(in) :: rhoq(KA,I_QV:I_NG)
3545  !
3546  real(RP), intent(in) :: cpa(KA)
3547  real(RP), intent(in) :: dTdt_rad(KA)
3548  real(RP), intent(in) :: qke(KA)
3549  real(RP), intent(in) :: dt
3550  real(RP), intent(in) :: CCN(KA)
3551  real(RP), intent(in) :: nc_uplim_d
3552  !
3553  real(RP), intent(out) :: PQ(KA,PQ_MAX)
3554  !
3555  !
3556 ! real(RP) :: c_ccn_map(1) ! c_ccn horizontal distribution
3557 ! real(RP) :: kappa_map(1) ! kappa horizontal distribution
3558 ! real(RP) :: c_in_map(1) ! c_in horizontal distribution ! [Add] 11/08/30 T.Mitsui
3559  real(RP) :: esw(KA) ! saturation vapor pressure, water
3560  real(RP) :: esi(KA) ! ice
3561  real(RP) :: ssw(KA) ! super saturation (water)
3562  real(RP) :: ssi(KA) ! super saturation (ice)
3563 ! real(RP) :: w_dsswdz(KA) ! w*(d_ssw/ d_z) super saturation(water) flux
3564  real(RP) :: w_dssidz(KA) ! w*(d_ssi/ d_z), 09/04/14 T.Mitsui
3565 ! real(RP) :: ssw_below(KA) ! ssw(k-1)
3566  real(RP) :: ssi_below(KA) ! ssi(k-1), 09/04/14 T.Mitsui
3567  real(RP) :: z_below(KA) ! z(k-1)
3568  real(RP) :: dzh ! z(k)-z(k-1)
3569  real(RP) :: pv ! vapor pressure
3570  ! work variables for Twomey Equation.
3571  real(RP) :: qsw(KA)
3572  real(RP) :: qsi(KA)
3573  real(RP) :: dqsidtem_rho(KA)
3574  real(RP) :: dssidt_rad(KA)
3575  real(RP) :: wssi, wdssi
3576  !
3577 
3578  real(RP) :: cva(KA)
3579  real(RP) :: dq_xa(KA,HYDRO_MAX)
3580  real(RP) :: vt_xa(KA,HYDRO_MAX,2) ! terminal velocity
3581  real(RP) :: dTdt_dep(KA)
3582  real(RP) :: PLIdep_total(KA)
3583  real(RP) :: wtem(KA) ! temperature[K]
3584  real(RP) :: dqsidpre_tem(KA)
3585  real(RP) :: dqsidtem_pre(KA)
3586  real(RP) :: dssidt
3587  real(RP) :: dssidt_mp(KA)
3588  real(RP) :: dssidt_dyn(KA)
3589  !!
3590 
3591 
3592 ! real(RP) :: xi_nuc(1) ! xi use the value @ cloud base
3593 ! real(RP) :: alpha_nuc(1) ! alpha_nuc
3594 ! real(RP) :: eta_nuc(1) ! xi use the value @ cloud base
3595  !
3596  real(RP) :: sigma_w(KA)
3597  real(RP) :: weff(KA)
3598  real(RP) :: weff_max(KA)
3599  real(RP) :: velz(KA)
3600  !
3601  real(RP) :: coef_ccn
3602  real(RP) :: slope_ccn
3603  real(RP) :: nc_new(KA)
3604  real(RP) :: nc_new_below(KA)
3605  real(RP) :: dnc_new
3606  real(RP) :: nc_new_max ! Lohmann (2002),
3607  real(RP) :: a_max
3608  real(RP) :: b_max
3609  logical :: flag_nucleation(KA)
3610  !
3611  real(RP) :: r_gravity
3612  real(RP), parameter :: r_sqrt3=0.577350269_rp ! = sqrt(1.0/3.0)
3613  real(RP), parameter :: eps=1.e-30_rp
3614  !====> ! 09/08/18
3615  !
3616  real(RP) :: dlcdt_max, dli_max ! defined by supersaturation
3617  real(RP) :: dncdt_max, dni_max ! defined by supersaturation
3618  real(RP) :: rdt
3619 
3620  real(RP) :: tmp
3621  !
3622  integer :: k
3623  !
3624  !
3625 
3626  if( so22_het ) then
3627  do k = ks, ke
3628  ! Temperature lower limit is only used for saturation condition.
3629  ! On the other hand original "tem" is used for calculation of latent heat or energy equation.
3630  wtem(k) = max( tem(k), tem_min )
3631  end do
3632  endif
3633 
3634 
3635 ! c_ccn_map(1) = c_ccn
3636 ! kappa_map(1) = kappa
3637 ! c_in_map(1) = c_in
3638  !
3639  !
3640  rdt = 1.0_rp/dt
3641  r_gravity = 1.0_rp/grav
3642  !
3643  call moist_psat_liq ( ka, ks, ke, &
3644  tem(:), esw(:) ) ! [IN], [OUT]
3645  call moist_psat_ice ( ka, ks, ke, &
3646  tem(:), esi(:) ) ! [IN], [OUT]
3647  call moist_pres2qsat_liq ( ka, ks, ke, &
3648  tem(:), pre(:), qdry(:), & ! [IN]
3649  qsw(:) ) ! [OUT]
3650  call moist_pres2qsat_ice ( ka, ks, ke, &
3651  tem(:), pre(:), qdry(:), & ! [IN]
3652  qsi(:) ) ! [OUT]
3653  call moist_dqsi_dtem_dens( ka, ks, ke, &
3654  tem(:), rho(:), & ! [IN]
3655  dqsidtem_rho(:) ) ! [OUT]
3656 
3657  if( so22_het ) then
3658  call moist_dqs_dtem_dpre_ice( ka, ks, ke, &
3659  wtem(:), pre(:), qdry(:), & ! [IN]
3660  dqsidtem_pre(:), dqsidpre_tem(:) ) ! [OUT]
3661  endif
3662  !!
3663 
3664 
3665  !
3666  ! Lohmann (2002),JAS, eq.(1) but changing unit [cm-3] => [m-3]
3667  a_max = 1.e+6_rp*0.1_rp*(1.e-6_rp)**1.27_rp
3668  b_max = 1.27_rp
3669  !
3670  ssi_max = 1.0_rp
3671 
3672  do k = ks, ke
3673  pv = rhoq(k,i_qv)*rvap*tem(k)
3674  ssw(k) = min( mp_ssw_lim, ( pv/esw(k)-1.0_rp ) )*100.0_rp
3675  ssi(k) = ( pv/esi(k) - 1.00_rp )
3676 ! ssw_below(k+1) = ssw(k)
3677  ssi_below(k+1) = ssi(k)
3678  z_below(k+1) = cz(k)
3679  end do
3680 ! ssw_below(KS) = ssw(KS)
3681  ssi_below(ks) = ssi(ks)
3682  z_below(ks) = cz(ks-1)
3683 
3684  ! dS/dz is evaluated by first order upstream difference
3685  !*** Solution for Twomey Equation ***
3686 ! coef_ccn = 1.E+6_RP*0.88_RP*(c_ccn_map(1)*1.E-6_RP)**(2.0_RP/(kappa_map(1) + 2.0_RP)) * &
3687  coef_ccn = 1.e+6_rp*0.88_rp*(c_ccn*1.e-6_rp)**(2.0_rp/(kappa + 2.0_rp)) &
3688 ! * (70.0_RP)**(kappa_map(1)/(kappa_map(1) + 2.0_RP))
3689  * (70.0_rp)**(kappa/(kappa + 2.0_rp))
3690 ! slope_ccn = 1.5_RP*kappa_map(1)/(kappa_map(1) + 2.0_RP)
3691  slope_ccn = 1.5_rp*kappa/(kappa + 2.0_rp)
3692  !
3693  do k=ks, ke
3694  sigma_w(k) = r_sqrt3*sqrt(max(qke(k),qke_min))
3695  end do
3696  sigma_w(ks-1) = sigma_w(ks)
3697  sigma_w(ke+1) = sigma_w(ke)
3698  ! effective vertical velocity
3699  do k=ks, ke
3700  weff(k) = w(k) - cpa(k)*r_gravity*dtdt_rad(k)
3701  end do
3702  !
3703  if( mp_couple_aerosol ) then
3704 
3705  do k = ks, ke
3706  if( ssw(k) > 1.e-10_rp .AND. pre(k) > 300.e+2_rp ) then
3707  nc_new(k) = max( ccn(k), c_ccn )
3708  else
3709  nc_new(k) = 0.0_rp
3710  endif
3711  enddo
3712 
3713  else
3714 
3715  if( nucl_twomey ) then
3716  ! diagnose cloud condensation nuclei
3717  do k = ks, ke
3718  ! effective vertical velocity (maximum vertical velocity in turbulent flow)
3719  weff_max(k) = weff(k) + sigma_w(k)
3720  ! large scale upward motion region and saturated
3721  if( (weff(k) > 1.e-8_rp) .AND. (ssw(k) > 1.e-10_rp) .AND. pre(k) > 300.e+2_rp )then
3722  ! Lohmann (2002), eq.(1)
3723  nc_new_max = coef_ccn*weff_max(k)**slope_ccn
3724  nc_new(k) = a_max*nc_new_max**b_max
3725  else
3726  nc_new(k) = 0.0_rp
3727  end if
3728  end do
3729 
3730  else
3731  ! calculate cloud condensation nuclei
3732  do k = ks, ke
3733  if( ssw(k) > 1.e-10_rp .AND. pre(k) > 300.e+2_rp ) then
3734  nc_new(k) = c_ccn*ssw(k)**kappa
3735  else
3736  nc_new(k) = 0.0_rp
3737  endif
3738  enddo
3739  endif
3740 
3741  endif
3742 
3743  do k = ks, ke
3744  ! nc_new is bound by upper limit
3745  if( nc_new(k) > nc_uplim_d ) then ! no more CCN
3746  flag_nucleation(k) = .false.
3747  nc_new_below(k+1) = 1.e+30_rp
3748  else if( nc_new(k) > eps ) then ! nucleation can occur
3749  flag_nucleation(k) = .true.
3750  nc_new_below(k+1) = nc_new(k)
3751  else ! nucleation cannot occur(unsaturated or negative w)
3752  flag_nucleation(k) = .false.
3753  nc_new_below(k+1) = 0.0_rp
3754  end if
3755  end do
3756  nc_new_below(ks) = 0.0_rp
3757 ! do k=KS, KE
3758  ! search maximum value of nc_new
3759 ! if( ( nc_new(k) < nc_new_below(k) ) .OR. &
3760 ! ( nc_new_below(k) > c_ccn_map(1)*0.05_RP ) )then ! 5% of c_ccn
3761 ! ( nc_new_below(k) > c_ccn*0.05_RP ) )then ! 5% of c_ccn
3762 ! flag_nucleation(k) = .false.
3763 ! end if
3764 ! end do
3765 
3766  if( mp_couple_aerosol ) then
3767  do k = ks, ke
3768  ! nucleation occurs at only cloud base.
3769  ! if CCN is more than below parcel, nucleation newly occurs
3770  ! effective vertical velocity
3771  if ( flag_nucleation(k) .AND. & ! large scale upward motion region and saturated
3772  tem(k) > tem_ccn_low ) then
3773  dlcdt_max = ( rhoq(k,i_qv) - esw(k) / ( rvap * tem(k) ) ) * rdt
3774  dlcdt_max = max( dlcdt_max, 0.0_rp ) ! dlcdt_max can be artificially negative due to truncation error in floating point operation
3775  dncdt_max = dlcdt_max/xc_min
3776 ! dnc_new = nc_new(k)-rhoq(k,I_NC)
3777  dnc_new = nc_new(k)
3778  pq(k,i_ncccn) = min( dncdt_max, dnc_new*rdt )
3779  pq(k,i_lcccn) = min( dlcdt_max, xc_min*pq(k,i_ncccn) )
3780  else
3781  pq(k,i_ncccn) = 0.0_rp
3782  pq(k,i_lcccn) = 0.0_rp
3783  end if
3784  end do
3785  else
3786 
3787  if( nucl_twomey ) then
3788  do k = ks, ke
3789  ! nucleation occurs at only cloud base.
3790  ! if CCN is more than below parcel, nucleation newly occurs
3791  ! effective vertical velocity
3792  if ( flag_nucleation(k) .AND. & ! large scale upward motion region and saturated
3793  tem(k) > tem_ccn_low .AND. &
3794  nc_new(k) > rhoq(k,i_nc) ) then
3795  dlcdt_max = ( rhoq(k,i_qv) - esw(k) / ( rvap * tem(k) ) ) * rdt
3796  dlcdt_max = max( dlcdt_max, 0.0_rp ) ! dlcdt_max can be artificially negative due to truncation error in floating point operation
3797  dncdt_max = dlcdt_max/xc_min
3798  dnc_new = nc_new(k)-rhoq(k,i_nc)
3799  pq(k,i_ncccn) = min( dncdt_max, dnc_new*rdt )
3800  pq(k,i_lcccn) = min( dlcdt_max, xc_min*pq(k,i_ncccn) )
3801  else
3802  pq(k,i_ncccn) = 0.0_rp
3803  pq(k,i_lcccn) = 0.0_rp
3804  end if
3805  end do
3806  else
3807  do k = ks, ke
3808  ! effective vertical velocity
3809  if( tem(k) > tem_ccn_low .AND. &
3810  nc_new(k) > rhoq(k,i_nc) ) then
3811  dlcdt_max = ( rhoq(k,i_qv) - esw(k) / ( rvap * tem(k) ) ) * rdt
3812  dlcdt_max = max( dlcdt_max, 0.0_rp ) ! dlcdt_max can be artificially negative due to truncation error in floating point operation
3813  dncdt_max = dlcdt_max/xc_min
3814  dnc_new = nc_new(k)-rhoq(k,i_nc)
3815  pq(k,i_ncccn) = min( dncdt_max, dnc_new*rdt )
3816  pq(k,i_lcccn) = min( dlcdt_max, xc_min*pq(k,i_ncccn) )
3817  else
3818  pq(k,i_ncccn) = 0.0_rp
3819  pq(k,i_lcccn) = 0.0_rp
3820  end if
3821  end do
3822  endif
3823 
3824  endif
3825 
3826  !
3827  ! ice nucleation
3828  !
3829  ! +++ NOTE ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
3830  ! Based on Phillips etal.(2006).
3831  ! However this approach doesn't diagnose Ni itself but diagnose tendency.
3832  ! Original approach adjust Ni instantaneously .
3833  ! +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
3834 
3835  if( so22_het .or. opt_nucleation_ice_hom ) then
3836  call dep_vapor_ice_wrk( & ! in
3837  ka, ks, ke, & ! in
3838  plidep_total(:), & ! out for ice nucleation
3839  rho(:), tem(:), pre(:), & ! in
3840  qdry(:), esi(:), qsi(:), & ! in
3841  rhoq(:,:), & ! in
3842  vt_xa, dq_xa, & ! in
3843  dt ) ! in
3844 
3845  do k = ks, ke
3846  dtdt_dep(k) = (lhs0+(cv_vapor-cv_ice)*tem(k))*plidep_total(k)/(rho(k)*cva(k))
3847  enddo
3848  else
3849  dtdt_dep(:) = 0.0_rp
3850  endif
3851 
3852  do k = ks, ke-1
3853  velz(k) = ( w(k) * ( cz(k+1) - fz(k) ) + w(k+1) * ( fz(k) - cz(k) ) ) / ( cz(k+1) - cz(k) ) ! @ half level
3854  end do
3855  velz(ke) = 0.0_rp
3856  do k = ks, ke
3857  dzh = cz(k) - z_below(k)
3858  w_dssidz(k) = velz(k) * (ssi(k) - ssi_below(k))/dzh
3859  dssidt_rad(k) = -rhoq(k,i_qv)/(rho(k)*qsi(k)*qsi(k))*dqsidtem_rho(k)*dtdt_rad(k)
3860  dli_max = ( rhoq(k,i_qv) - esi(k) / ( rvap * tem(k) ) ) * rdt
3861  dli_max = max( dli_max, 0.0_rp ) ! dli_max can be artificially negative due to truncation error in floating point operation
3862  dni_max = min( dli_max/xi_ccn, (in_max-rhoq(k,i_ni))*rdt )
3863  wdssi = min( w_dssidz(k)+dssidt_rad(k), 0.01_rp)
3864  wssi = min( ssi(k), ssi_max)
3865 
3866  !! Seiki and Ohno 2022
3867  if( so22_het ) then
3868  dssidt_mp(k) = -plidep_total(k)/(rho(k)*qsi(k))
3869  !! PLIdep(k) -> PQ(k,I_LIdep)
3870  dssidt_rad(k) = -rhoq(k,i_qv)/(rho(k)*qsi(k)*qsi(k))*dqsidtem_rho(k)*dtdt_rad(k)
3871  !!
3872  dssidt_dyn(k) = +rhoq(k,i_qv)/(rho(k)*qsi(k)*qsi(k))&
3873  * velz(k)*grav*(dqsidtem_pre(k)/cpa(k)+dqsidpre_tem(k)*rho(k))
3874  ! * w(k)*CNST_GRAV*(dqsidtem_pre(ij,k)/cpa(ij,k)+dqsidpre_tem(ij,k)*rho(ij,k))
3875  dssidt = dssidt_mp(k) + dssidt_rad(k) + dssidt_dyn(k)
3876  endif
3877 
3878  ! SB06(34),(35)
3879 !# if( ( wdssi > eps ) .AND. & !
3880 !# (tem(k) < 273.15_RP ) .AND. & !
3881 !# (rhoq(k,I_NI) < in_max ) .AND. &
3882 !# (wssi >= eps ) )then !
3883 !# tmp = c_in * nm_M92 * exp( 0.3_RP * bm_M92 * ( wssi - 0.1_RP ) )
3884 !# if( inucl_w ) then
3885 !# tmp = bm_M92 * 0.3_RP * tmp * wdssi
3886 !# else
3887 !# tmp = max( tmp - rhoq(k,I_NI), 0.0_RP ) * rdt
3888 !# endif
3889 !# PQ(k,I_NIccn) = min(dni_max, tmp)
3890 !# PQ(k,I_LIccn) = min(dli_max, PQ(k,I_NIccn)*xi_ccn )
3891 !# else
3892 !# PQ(k,I_NIccn) = 0.0_RP
3893 !# PQ(k,I_LIccn) = 0.0_RP
3894 !# end if
3895  if( (tem(k) < 273.15_rp ) .AND. & !
3896  (rhoq(k,i_ni) < in_max ) .AND. &
3897  (wssi >= eps ) )then !
3898  tmp = c_in * nm_m92 * exp( 0.3_rp * bm_m92 * ( wssi - 0.1_rp ) )
3899  if( inucl_w .and. wdssi > eps ) then
3900  tmp = bm_m92 * 0.3_rp * tmp * wdssi
3901  elseif( so22_het .and. dssidt > eps ) then
3902  tmp = bm_m92 * 0.3_rp * tmp * dssidt
3903  else
3904  tmp = max( tmp - rhoq(k,i_ni), 0.0_rp ) * rdt
3905  endif
3906  pq(k,i_niccn) = min(dni_max, tmp)
3907  pq(k,i_liccn) = min(dli_max, pq(k,i_niccn)*xi_ccn )
3908  else
3909  pq(k,i_niccn) = 0.0_rp
3910  pq(k,i_liccn) = 0.0_rp
3911  end if
3912 
3913 
3914  end do
3915 
3916  if( opt_nucleation_ice_hom ) then
3917  call nucleation_ice_hom( &
3918  ka, ks, ke, & !in
3919  tem, pre, rho, & !in
3920  qdry, rhoq(:,i_qv), & !in
3921  cva, cpa, & !in
3922  w, & !in
3923  dtdt_rad, & !in
3924  dtdt_dep, & !in
3925  plidep_total, dt, & !in
3926  pq(:,i_lihom), & !out
3927  pq(:,i_nihom) ) !out
3928  else
3929  pq(:,i_lihom) = 0.0_rp
3930  pq(:,i_nihom) = 0.0_rp
3931  endif
3932 
3933 
3934  return
3935  end subroutine nucleation
3936  !----------------------------
3937 
3938 !OCL SERIAL
3939  subroutine nucleation_ice_hom( &
3940  KA, KS, KE, &
3941  tem, pre, rho, &
3942  qd, rhoq_qv, cva, cpa, &
3943  w, dTdt_rad, dTdt_dep, &
3944  PLIdep, dt, PLIhom, PNIhom )
3945  use scale_prc, only: &
3946  prc_abort
3947  use scale_const, only: &
3948  psat0 => const_psat0, &
3949  t00 => const_tem00, &
3950  pstd => const_pstd, &
3951  cpvap => const_cpvap, &
3952  cvvap => const_cvvap, &
3953  ci => const_ci, &
3954  cl => const_cl, &
3955  rvap => const_rvap, &
3956  rdry => const_rdry, &
3957  lhs00 => const_lhs00, &
3958  lhs0 => const_lhs0, &
3959  lhv00 => const_lhv00, &
3960  lhf00 => const_lhf00, &
3961  epsvap => const_epsvap, &
3962  grav => const_grav, &
3963  pi => const_pi
3964  implicit none
3965 
3966  integer, intent(in) :: KA, KS, KE
3967 
3968  real(RP), intent(in) :: tem(KA)
3969  real(RP), intent(in) :: pre(KA)
3970  real(RP), intent(in) :: rho(KA)
3971  real(RP), intent(in) :: qd(KA)
3972  real(RP), intent(in) :: rhoq_qv(KA)
3973  real(RP), intent(in) :: cpa(KA) ! specific heat @ cnst. pressure
3974  real(RP), intent(in) :: cva(KA) ! specific heat @ cnst. volume
3975  ! balance equation @ homogeneous ice nucleation
3976  real(RP), intent(in) :: w(KA) ! adiabatic ascending
3977  real(RP), intent(in) :: dTdt_rad(KA) ! effect of radiative heating
3978  real(RP), intent(in) :: dTdt_dep(KA) ! effect of radiative heating
3979  real(RP), intent(in) :: PLIdep(KA)
3980 ! real(RP), intent(out) :: PQ(KA,PQ_MAX) ! competition effect by vapor consumption
3981  real(RP), intent(out):: PLIhom(KA)
3982  real(RP), intent(out):: PNIhom(KA)
3983  real(RP), intent(in) :: dt
3984  real(RP), parameter :: rhoi=916.0_rp ! ice density [kg/m3]
3985  real(RP), parameter :: rrhoi=1.0_rp/rhoi !
3986  real(RP), parameter :: Mw=18.01528_rp ! Water Molar Weight
3987  real(RP), parameter :: Nav=6.0221415e+23_rp ! Avogadro Number
3988  real(RP), parameter :: vw=(mw*1.e-3_rp/nav)/rhoi ! volume of a water molecule in ice phase
3989  ! 18nm*exp( 3.0*log(1.5)**2 )=29.4760367
3990  real(RP), parameter :: r0=29.5e-9_rp ! aerosol mass(volume) mode radius
3991  real(RP), parameter :: c_gf = 1.01187_rp ! dAlmeida
3992  real(RP), parameter :: g_gf = -0.206449_rp ! dAlmeida
3993  real(RP), parameter :: rho_min=1.e-5_rp ! 3.e-3 is lower limit recognized in many experiments.
3994  real(RP), parameter :: tem_min=150.0_rp
3995  real(RP), parameter :: ni_max =300.e+6_rp
3996 ! real(RP) :: dTdt_dep(KA) ! effect of deposition heating
3997  real(RP) :: wtem
3998  real(RP) :: esi, esw
3999  real(RP) :: qsi
4000  real(RP) :: lhs
4001  real(RP) :: dqsidtem
4002  real(RP) :: den1, den2
4003  real(RP) :: dqsidt_pre
4004  real(RP) :: dqsidp_tem
4005  real(RP) :: rw
4006  real(RP) :: temc_lim
4007  real(RP) :: rho_lim
4008  real(RP) :: pre_lim
4009  real(RP) :: Dw
4010  real(RP) :: si, sw
4011  real(RP) :: Scr
4012  real(RP) :: dsidt_mp
4013  real(RP) :: dsidt_rd
4014  real(RP) :: wp
4015  real(RP) :: a1,a2,a3
4016  real(RP) :: b1,b2
4017  real(RP) :: dlogJdT
4018  real(RP) :: dtemdt_dyn
4019  real(RP) :: rtau ! 1/tau
4020  real(RP) :: delta
4021  real(RP) :: kappa
4022  real(RP) :: Rim_w
4023  real(RP) :: ri_wrk
4024  real(RP) :: ri
4025  !
4026  real(RP), parameter :: r2pi = 0.5_rp/pi ! 1/2pi
4027  real(RP), parameter :: sqrt_pi = sqrt(pi)
4028  real(RP), parameter :: coef_mi = 4.0_rp/3.0_rp*pi*rhoi
4029  real(RP), parameter :: eps = 1.e-30_rp
4030  real(RP) :: rdt
4031  integer :: ierr
4032  integer :: ij,k
4033  !
4034 
4035  rdt = 1.0_rp/dt
4036  plihom(:) = 0.0_rp
4037  pnihom(:) = 0.0_rp
4038 ! PQ(:,I_NIhom) = 0.0_RP
4039 ! PQ(:,I_LIhom) = 0.0_RP
4040 ! PQ(1:KS,I_NIhom) = 0.0_RP
4041 ! PQ(1:KS,I_LIhom) = 0.0_RP
4042 ! PQ(KE:KA,I_NIhom) = 0.0_RP
4043 ! PQ(KE:KA,I_LIhom) = 0.0_RP
4044  do k = ks, ke
4045  wtem= max(tem(k), tem_min)
4046  esi = min( psat0 &
4047  * ( wtem / t00 ) ** ( ( cpvap - ci ) / rvap ) &
4048  * exp( lhs00 / rvap &
4049  * ( 1.0_rp / t00 - 1.0_rp / wtem ) ), pre(k))
4050  esw = psat0 &
4051  * ( wtem / t00 ) ** ( ( cpvap - cl ) / rvap ) &
4052  * exp( lhv00 / rvap &
4053  * ( 1.0_rp / t00 - 1.0_rp / wtem ) )
4054  ! (10) in Ren and MacKenzie (2005)
4055  scr = 2.349_rp - wtem/259.0_rp
4056  qsi = epsvap * esi / ( pre(k) - ( 1.0_rp - epsvap ) * esi )
4057  si = rhoq_qv(k)*rvap*wtem/esi ! rho(k)*qv(k)
4058  ! sw must be less than 1 to calculate hygroscopic growth (otherwise, already activated)
4059  sw = min(rho(k)*rhoq_qv(k)*rvap*wtem/esw,0.999_rp)
4060  if ( si < scr ) then
4061  ! No nucleation occurs
4062  qsi = 0.0_rp
4063  lhs = lhs00 + (cpvap - ci )*(wtem-t00)
4064  dqsidtem = 0.0_rp
4065  si = 0.0_rp
4066  sw = 0.0_rp
4067  scr = 100.0_rp
4068  a1 = 0.0_rp
4069  wp = -1.0_rp
4070  rtau = -1.0_rp
4071  else
4072  ! (dsi/dt)_MP
4073  lhs = lhs0 + (cpvap - ci)*(wtem-t00)
4074  dqsidtem = esi/(rho(k)*rvap*wtem*wtem)&
4075  * (lhs/(rvap*wtem)-1.0_rp)
4076  dsidt_mp = -1.0_rp/(rho(k)*qsi) &
4077  * (1.0_rp+si*(lhv00+lhf00+(cvvap-ci)*wtem)/cva(k)*dqsidtem)&
4078  * plidep(k)
4079  dsidt_rd = -si/qsi*dqsidtem*dtdt_rad(k)
4080  ! This is an simple formulation from original paper
4081  a1 = lhs0*grav/(cpa(k)*rvap*tem(k)*tem(k))&
4082  - grav/(rdry*tem(k))
4083 !!$ ! alternative formulation for NICAM-EXACT
4084 !!$ den1 = (pre(k)-(1.0_RP-EPSvap)*esi)*(pre(k)-(1.0_RP-EPSvap)*esi)
4085 !!$ den2 = den1*Rvap*wtem*wtem
4086 !!$ dqsidp_tem=-EPSvap* esi/den1
4087 !!$ dqsidt_pre= EPSvap*pre(k)*lhs*esi/den2
4088 !!$ a1 = GRAV/qsi*(dqsidt_pre/cpa(k)+dqsidp_tem*rho(k))
4089  wp = w(k) + 1.0_rp/(a1*si)*(dsidt_mp+dsidt_rd)
4090  ! (21) in RM05
4091  dlogjdt = -0.004_rp*wtem*wtem + 2.0_rp*wtem - 304.4_rp
4092  ! (22) in RM05
4093  dtemdt_dyn= - grav*w(k)/cpa(k)
4094  rtau = dlogjdt*(dtdt_rad(k)+dtdt_dep(k)+dtemdt_dyn )
4095  endif
4096  rw = r0*c_gf*(1-sw)**g_gf
4097 
4098  if ( wp > eps .AND. rtau > eps ) then
4099  ! a1,a2,a3,b1,b2 are given by Appendix B in RM05
4100  temc_lim= max(tem(k)-t00, temc_lim_diff )
4101  rho_lim = max(rho(k),rho_min) !
4102  pre_lim = rho_lim*(qd(k)*rdry + rhoq_qv(k)*rvap)*(temc_lim+t00)! only for Dw
4103  dw = 0.211e-4_rp* (((temc_lim+t00)/t00)**1.94_rp) *(pstd/pre_lim)
4104  ! v_th = sqrt(8*Rv*T/pi) in the paragraph after eq(2) in Karcher etal.(2006)
4105  b2 = 0.5_rp/dw*sqrt(rvap*wtem*r2pi)
4106  b1 = (si-1.0_rp)*0.5_rp*rrhoi*esi/sqrt(2.0_rp*pi*rvap*wtem)
4107  a2 = mw*rvap*wtem/(nav*esi)
4108  a3 = epsvap*mw*lhs0*lhs0/(nav*cpa(k)*pre(k)*wtem)
4109  delta = b2*rw
4110  kappa = 2.0_rp*b1*b2/( rtau*(1.0_rp+delta)*(1.0_rp+delta) )
4111  ! (A9) in RM05
4112  rim_w = max(1.e-20_rp, 0.5_rp*(1.0_rp+delta)*(3.0_rp*kappa/(2.0_rp+sqrt(1.0_rp+9.0_rp/pi*kappa))) &
4113  + 1.0_rp/(1.0_rp+delta)*(3.0_rp /(2.0_rp+sqrt(1.0_rp+9.0_rp/pi*kappa)))+delta-1.0_rp )
4114  pnihom(k) = min( scr/(scr-1.0_rp)*a1*wp/(rim_w*4.0_rp*pi*dw/b2), ni_max )* rdt
4115  ri_wrk = 1.0_rp+b2*rw
4116  ri = ( sqrt(ri_wrk*ri_wrk + 2.0_rp*b1*b2*dt )-1.0_rp )/b2
4117  plihom(k) = coef_mi*ri*ri*ri*pnihom(k)
4118  else
4119  plihom(k) = 0.0_rp
4120  pnihom(k) = 0.0_rp
4121  endif
4122  enddo
4123  !
4124  return
4125  end subroutine nucleation_ice_hom
4126 
4127 !OCL SERIAL
4128  subroutine ice_multiplication( &
4129  KA, KS, KE, & ! in
4130  flg_lt, & ! in
4131  Pac, & ! in
4132  tem, rhoq, & ! in
4133  rhoq_crg, xq, & ! in
4134  PQ, Pcrg1 ) ! inout
4135 
4136  ! ice multiplication by splintering
4137  ! we consider Hallet-Mossop process
4138  use scale_specfunc, only: &
4139  gammafunc => sf_gamma
4140  implicit none
4141  integer, intent(in) :: KA, KS, KE
4142 
4143  real(RP), intent(in) :: Pac(KA,Pac_MAX)
4144  real(RP), intent(in) :: tem(KA)
4145  real(RP), intent(in) :: rhoq(KA,I_QV:I_NG)
4146  real(RP), intent(in) :: xq(KA,HYDRO_MAX)
4147  !
4148  real(RP), intent(inout):: PQ(KA,PQ_MAX)
4149  ! for lightning
4150  logical, intent(in) :: flg_lt
4151  real(RP), intent(in) :: rhoq_crg(KA,I_QC:I_QG)
4152  real(RP), intent(inout):: Pcrg1(KA,PQ_MAX)
4153  !
4154  ! production of (350.d3 ice particles)/(cloud riming [g]) => 350*d6 [/kg]
4155  real(RP), parameter :: pice = 350.0e+6_rp
4156  ! production of (1 ice particle)/(250 cloud particles riming)
4157  real(RP), parameter :: pnc = 250.0_rp
4158  ! temperature factor
4159  real(RP) :: fp
4160 
4161  real(RP) :: igm ! in complete gamma(x,alpha)
4162  real(RP) :: x
4163  ! coefficient of expansion using in calculation of igm
4164  real(RP) :: a0,a1,a2,a3,a4,a5
4165  real(RP) :: a6,a7,a8,a9,a10
4166  real(RP) :: an1,an2,b0,b1,b2,c0,c1,c2
4167  real(RP) :: d0,d1,d2,e1,e2,h0,h1,h2
4168  real(RP), parameter :: eps=1.0e-30_rp
4169  ! number of cloud droplets larger than 12 micron(radius).
4170  real(RP) :: n12
4171  !
4172  real(RP) :: wn, wni, wns, wng
4173  integer :: k, iq
4174  real(RP) :: sw1
4175  !
4176  !
4177 !OCL LOOP_FISSION_TARGET(LS)
4178  do k = ks, ke
4179  ! Here we assume particle temperature is same as environment temperature.
4180  ! If you want to treat in a better manner,
4181  ! you can diagnose with eq.(64) in CT(86)
4182  if (tem(k) > 270.16_rp)then
4183  fp = 0.0_rp
4184  else if(tem(k) >= 268.16_rp)then
4185  fp = (270.16_rp-tem(k))*0.5_rp
4186  else if(tem(k) >= 265.16_rp)then
4187  fp = (tem(k)-265.16_rp)*0.333333333_rp
4188  else
4189  fp = 0.0_rp
4190  end if
4191  ! Approximation of Incomplete Gamma function
4192  ! Here we calculate with algorithm by Numerical Recipes.
4193  ! This approach is based on eq.(78) in Cotton etal.(1986),
4194  ! but more accurate and expanded for Generalized Gamma Distribution.
4195  x = coef_lambda(i_mp_qc)*(xc_cr/xq(k,i_mp_qc))**mu(i_mp_qc)
4196  !
4197  if(x<1.e-2_rp*alpha)then ! negligible
4198  igm = 0.0_rp
4199  else if(x<alpha+1.0_rp)then ! series expansion
4200  ! 10th-truncation is enough for cloud droplet.
4201  a0 = 1.0_rp/alpha ! n=0
4202  a1 = a0*x/(alpha+1.0_rp) ! n=1
4203  a2 = a1*x/(alpha+2.0_rp) ! n=2
4204  a3 = a2*x/(alpha+3.0_rp) ! n=3
4205  a4 = a3*x/(alpha+4.0_rp) ! n=4
4206  a5 = a4*x/(alpha+5.0_rp) ! n=5
4207  a6 = a5*x/(alpha+6.0_rp) ! n=6
4208  a7 = a6*x/(alpha+7.0_rp) ! n=7
4209  a8 = a7*x/(alpha+8.0_rp) ! n=8
4210  a9 = a8*x/(alpha+9.0_rp) ! n=9
4211  a10 = a9*x/(alpha+10.0_rp) ! n=10
4212  igm = (a0+a1+a2+a3+a4+a5+a6+a7+a8+a9+a10)*exp( -x + alpha*log(x) - lgm )
4213  else if(x<alpha*100.0_rp) then ! continued fraction expansion
4214  ! 2nd-truncation is enough for cloud droplet.
4215  ! setup
4216  b0 = x+1.0_rp-alpha
4217  c0 = 1.0_rp/eps
4218  d0 = 1.0_rp/b0
4219  h0 = d0
4220  ! n=1
4221  an1 = -(1.0_rp-alpha)
4222  b1 = b0 + 2.0_rp
4223  d1 = 1.0_rp/(an1*d0+b1)
4224  c1 = b1+an1/c0
4225  e1 = d1*c1
4226  h1 = h0*e1
4227  ! n=2
4228  an2 = -2.0_rp*(2.0_rp-alpha)
4229  b2 = b1 + 2.0_rp
4230  d2 = 1.0_rp/(an2*d1+b2)
4231  c2 = b2+an2/c1
4232  e2 = d2*c2
4233  h2 = h1*e2
4234  !
4235  igm = 1.0_rp - exp( -x + alpha*log(x) - lgm )*h2
4236  else ! negligible
4237  igm = 1.0_rp
4238  end if
4239  ! n12 is number of cloud droplets larger than 12 micron.
4240  n12 = rhoq(k,i_nc)*(1.0_rp-igm)
4241  ! eq.(82) CT(86)
4242  wn = (pice + n12/((rhoq(k,i_qc)+xc_min)*pnc) )*fp ! filtered by xc_min
4243  wni = wn*(-pac(k,i_liaclc2li) ) ! riming production rate is all negative
4244  wns = wn*(-pac(k,i_lsaclc2ls) )
4245  wng = wn*(-pac(k,i_lgaclc2lg) )
4246  pq(k,i_nispl) = wni+wns+wng
4247  !
4248  pq(k,i_lsspl) = - wns*xq(k,i_mp_qi) ! snow => ice
4249  pq(k,i_lgspl) = - wng*xq(k,i_mp_qi) ! graupel => ice
4250  if (flg_lt) then
4251  sw1 = 0.5_rp - sign( 0.5_rp, rhoq(k,i_ns)-small ) !--- if NC is small,ignore charge transfer
4252  pcrg1(k,i_nsspl) = - wns*(1.0_rp-sw1) &
4253  / (rhoq(k,i_ns)+sw1)*rhoq_crg(k,i_qs)
4254  sw1 = 0.5_rp - sign( 0.5_rp, rhoq(k,i_ng)-small ) !--- if NC is small,ignore charge transfer
4255  pcrg1(k,i_ngspl) = - wng*(1.0_rp-sw1) &
4256  / (rhoq(k,i_ng)+sw1)*rhoq_crg(k,i_qg)
4257  pcrg1(k,i_nispl) = - ( pcrg1(k,i_nsspl) + pcrg1(k,i_ngspl) )
4258  end if
4259  !
4260  end do
4261  !
4262  return
4263  end subroutine ice_multiplication
4264 
4265  !----------------------------
4266 !OCL SERIAL
4268  ! collection process
4269  KA, KS, KE, & ! in
4270  flg_lt, & ! in
4271  d0_crg, v0_crg, & ! in
4272  beta_crg, dqcrg, & ! in
4273  wtem, rhoq, rhoq_crg, & ! in
4274  xq, dq_xave, vt_xave, & ! in
4275  ! rho ! [Add] 11/08/30
4276  PQ, & ! inout
4277  Pcrg1, Pcrg2, & ! inout
4278  Pac ) ! out
4279  use scale_atmos_saturation, only: &
4280  moist_psat_ice => atmos_saturation_psat_ice
4281  implicit none
4282 
4283  integer, intent(in) :: KA, KS, KE
4284 
4285  !--- mixed-phase collection process
4286  ! And all we set all production term as a negative sign to avoid confusion.
4287  !
4288  real(RP), intent(in) :: wtem(KA)
4289  !--- mass/number concentration[kg/m3]
4290  real(RP), intent(in) :: rhoq(KA,I_QV:I_NG)
4291  ! necessary ?
4292  real(RP), intent(in) :: xq(KA,HYDRO_MAX)
4293  !--- diameter of averaged mass( D(ave x) )
4294  real(RP), intent(in) :: dq_xave(KA,HYDRO_MAX)
4295  !--- terminal velocity of averaged mass( vt(ave x) )
4296  real(RP), intent(in) :: vt_xave(KA,HYDRO_MAX,2)
4297  ! [Add] 11/08/30 T.Mitsui, for autoconversion of ice
4298  ! real(RP), intent(in) :: rho(KA)
4299  !--- partial conversion
4300  real(RP), intent(inout):: PQ(KA,PQ_MAX)
4301  !
4302  real(RP), intent(out):: Pac(KA,Pac_MAX)
4303  !--- for lightning component
4304  logical, intent(in) :: flg_lt
4305  real(RP), intent(in) :: beta_crg(KA)
4306  real(RP), intent(in) :: dqcrg(KA)
4307  real(RP), intent(in) :: d0_crg, v0_crg
4308  real(RP), intent(in) :: rhoq_crg(KA,I_QC:I_QG)
4309  real(RP), intent(inout):: Pcrg1(KA,PQ_MAX)
4310  real(RP), intent(inout):: Pcrg2(KA,Pcrg_MAX)
4311 
4312  real(RP), parameter :: a_dec = 0.883_rp
4313  real(RP), parameter :: b_dec = 0.093_rp
4314  real(RP), parameter :: c_dec = 0.00348_rp
4315  real(RP), parameter :: d_dec = 4.5185e-5_rp
4316  !
4317  !
4318  real(RP) :: tem(KA)
4319  !
4320  !--- collection efficency of each specie
4321  real(RP) :: E_c(KA), E_r, E_i, E_s, E_g
4322  real(RP) :: E_ic, E_sc, E_gc
4323  !--- sticking efficiency
4324  real(RP) :: E_stick(KA)
4325  ! [Add] 10/08/03 T.Mitsui
4326  real(RP) :: temc, temc2, temc3
4327  real(RP) :: E_dec
4328  real(RP) :: esi_rat
4329  real(RP) :: esi(KA)
4330  !
4331  real(RP) :: temc_p, temc_m ! celcius tem.
4332 ! real(RP) :: ci_aut(KA)
4333 ! real(RP) :: taui_aut(KA)
4334 ! real(RP) :: tau_sce(KA)
4335  !--- DSD averaged diameter for each species
4336  real(RP) :: ave_dc ! cloud
4337 ! real(RP) :: ave_dr ! rain
4338  real(RP) :: ave_di(KA) ! ice
4339  real(RP) :: ave_ds(KA) ! snow
4340  real(RP) :: ave_dg ! graupel
4341  !--- coefficient of collection equations(L:mass, N:number)
4342  real(RP) :: coef_acc_LCI, coef_acc_NCI ! cloud - cloud ice
4343  real(RP) :: coef_acc_LCS, coef_acc_NCS ! cloud - snow
4344  !
4345  real(RP) :: coef_acc_LCG, coef_acc_NCG ! cloud - graupel
4346  real(RP) :: coef_acc_LRI_I, coef_acc_NRI_I ! rain - cloud ice
4347  real(RP) :: coef_acc_LRI_R, coef_acc_NRI_R ! rain - cloud ice
4348  real(RP) :: coef_acc_LRS_S, coef_acc_NRS_S ! rain - snow
4349  real(RP) :: coef_acc_LRS_R, coef_acc_NRS_R ! rain - snow
4350  real(RP) :: coef_acc_LRG, coef_acc_NRG ! rain - graupel
4351  real(RP) :: coef_acc_LII, coef_acc_NII ! cloud ice - cloud ice
4352  real(RP) :: coef_acc_LIS, coef_acc_NIS ! cloud ice - snow
4353  real(RP) :: coef_acc_NSS ! snow - snow
4354  real(RP) :: coef_acc_NGG ! grauepl - graupel
4355  real(RP) :: coef_acc_LSG, coef_acc_NSG(KA) ! snow - graupel
4356  !--- (diameter) x (diameter)
4357  real(RP) :: dcdc(KA), dcdi, dcds, dcdg
4358  real(RP) :: drdr(KA), drdi(KA), drds(KA), drdg
4359  real(RP) :: didi(KA), dids, didg
4360  real(RP) :: dsds(KA), dsdg
4361  real(RP) :: dgdg(KA)
4362  !--- (terminal velocity) x (terminal velocity)
4363  real(RP) :: vcvc(KA), vcvi, vcvs, vcvg
4364  real(RP) :: vrvr(KA), vrvi(KA), vrvs(KA), vrvg
4365  real(RP) :: vivi(KA), vivs, vivg
4366  real(RP) :: vsvs(KA), vsvg
4367  real(RP) :: vgvg(KA)
4368  !
4369  real(RP) :: wx_cri, wx_crs
4370  real(RP) :: coef_emelt
4371  real(RP) :: w1
4372 
4373  real(RP) :: sw, sw1, sw2
4374  real(RP) :: alpha_lt
4375  !
4376  integer :: k, iqw
4377  !
4378  !
4379  do k = ks, ke
4380  tem(k) = max( wtem(k), tem_min ) ! 11/08/30 T.Mitsui
4381  end do
4382 
4383  call moist_psat_ice( ka, ks, ke, &
4384  tem(:), esi(:) ) ! [IN], [OUT]
4385 
4386  if( opt_stick_ks96 )then
4387  do k = ks, ke
4388  ! Khain and Sednev (1996), eq.(3.15)
4389  temc = tem(k) - t00
4390  temc2 = temc*temc
4391  temc3 = temc2*temc
4392  e_dec = max(0.0_rp, a_dec + b_dec*temc + c_dec*temc2 + d_dec*temc3 )
4393  esi_rat = rhoq(k,i_qv)*rvap*tem(k)/esi(k)
4394  e_stick(k) = min(1.0_rp, e_dec*esi_rat)
4395  end do
4396  else if( opt_stick_co86 )then
4397  do k = ks, ke
4398  ! [Add] 11/08/30 T.Mitsui, Cotton et al. (1986)
4399  temc = min(tem(k) - t00,0.0_rp)
4400  w1 = 0.035_rp*temc-0.7_rp
4401  e_stick(k) = 10._rp**w1
4402  end do
4403  else
4404  do k = ks, ke
4405  ! Lin et al. (1983)
4406  temc_m = min(tem(k) - t00,0.0_rp) ! T < 273.15
4407  e_stick(k) = exp(0.09_rp*temc_m)
4408  end do
4409  end if
4410 
4411  do k = ks, ke
4412  ! averaged diameter using SB06(82)
4413  ave_dc = coef_d(i_mp_qc)*xq(k,i_mp_qc)**b_m(i_mp_qc)
4414  !------------------------------------------------------------------------
4415  ! coellection efficiency are given as follows
4416  e_c(k) = max(0.0_rp, min(1.0_rp, (ave_dc-dc0)/(dc1-dc0) ))
4417  end do
4418 
4419  !------------------------------------------------------------------------
4420  ! Collection: a collects b ( assuming particle size a>b )
4421  do k = ks, ke
4422  dcdc(k) = dq_xave(k,i_mp_qc) * dq_xave(k,i_mp_qc)
4423  drdr(k) = dq_xave(k,i_mp_qr) * dq_xave(k,i_mp_qr)
4424  didi(k) = dq_xave(k,i_mp_qi) * dq_xave(k,i_mp_qi)
4425  dsds(k) = dq_xave(k,i_mp_qs) * dq_xave(k,i_mp_qs)
4426  dgdg(k) = dq_xave(k,i_mp_qg) * dq_xave(k,i_mp_qg)
4427  drdi(k) = dq_xave(k,i_mp_qr) * dq_xave(k,i_mp_qi)
4428  drds(k) = dq_xave(k,i_mp_qr) * dq_xave(k,i_mp_qs)
4429  end do
4430  do k = ks, ke
4431  vcvc(k) = vt_xave(k,i_mp_qc,2) * vt_xave(k,i_mp_qc,2)
4432  vrvr(k) = vt_xave(k,i_mp_qr,2) * vt_xave(k,i_mp_qr,2)
4433  vivi(k) = vt_xave(k,i_mp_qi,2) * vt_xave(k,i_mp_qi,2)
4434  vsvs(k) = vt_xave(k,i_mp_qs,2) * vt_xave(k,i_mp_qs,2)
4435  vgvg(k) = vt_xave(k,i_mp_qg,2) * vt_xave(k,i_mp_qg,2)
4436  vrvi(k) = vt_xave(k,i_mp_qr,2) * vt_xave(k,i_mp_qi,2)
4437  vrvs(k) = vt_xave(k,i_mp_qr,2) * vt_xave(k,i_mp_qs,2)
4438  end do
4439 
4440  do k = ks, ke
4441  ave_di(k) = coef_d(i_mp_qi)*xq(k,i_mp_qi)**b_m(i_mp_qi)
4442  ave_ds(k) = coef_d(i_mp_qs)*xq(k,i_mp_qs)**b_m(i_mp_qs)
4443  end do
4444 
4445  !------------------------------------------------------------------------
4446  !
4447  !+++ pattern 1: a + b => a (a>b)
4448  ! (i-c, s-c, g-c, s-i, g-r, s-g)
4449  !------------------------------------------------------------------------
4450 
4451  ! cloud-ice => ice
4452  ! reduction term of cloud
4453  do k = ks, ke
4454  dcdi = dq_xave(k,i_mp_qc) * dq_xave(k,i_mp_qi)
4455  vcvi = vt_xave(k,i_mp_qc,2) * vt_xave(k,i_mp_qi,2)
4456  sw = 0.5_rp - sign(0.5_rp, di0-ave_di(k)) ! if(ave_di>di0)then sw=1
4457  e_i = e_im * sw
4458  e_ic = e_i*e_c(k)
4459  coef_acc_lci = &
4460  ( delta_b1(i_mp_qc)*dcdc(k) + delta_ab1(i_mp_qi,i_mp_qc)*dcdi + delta_b0(i_mp_qi)*didi(k) ) &
4461  * sqrt( theta_b1(i_mp_qc)*vcvc(k) - theta_ab1(i_mp_qi,i_mp_qc)*vcvi + theta_b0(i_mp_qi)*vivi(k) &
4462  + sigma_i + sigma_c )
4463  coef_acc_nci = &
4464  ( delta_b0(i_mp_qc)*dcdc(k) + delta_ab0(i_mp_qi,i_mp_qc)*dcdi + delta_b0(i_mp_qi)*didi(k) ) &
4465  * sqrt( theta_b0(i_mp_qc)*vcvc(k) - theta_ab0(i_mp_qi,i_mp_qc)*vcvi + theta_b0(i_mp_qi)*vivi(k) &
4466  + sigma_i + sigma_c )
4467  pac(k,i_liaclc2li)= -0.25_rp*pi*e_ic*rhoq(k,i_ni)*rhoq(k,i_qc)*coef_acc_lci
4468  pac(k,i_niacnc2ni)= -0.25_rp*pi*e_ic*rhoq(k,i_ni)*rhoq(k,i_nc)*coef_acc_nci
4469  end do
4470 
4471  ! cloud-snow => snow
4472  ! reduction term of cloud
4473  do k = ks, ke
4474  dcds = dq_xave(k,i_mp_qc) * dq_xave(k,i_mp_qs)
4475  vcvs = vt_xave(k,i_mp_qc,2) * vt_xave(k,i_mp_qs,2)
4476  sw = 0.5_rp - sign(0.5_rp, ds0-ave_ds(k)) ! if(ave_ds>ds0)then sw=1
4477  e_s = e_sm * sw
4478  e_sc = e_s*e_c(k)
4479  coef_acc_lcs = &
4480  ( delta_b1(i_mp_qc)*dcdc(k) + delta_ab1(i_mp_qs,i_mp_qc)*dcds + delta_b0(i_mp_qs)*dsds(k) ) &
4481  * sqrt( theta_b1(i_mp_qc)*vcvc(k) - theta_ab1(i_mp_qs,i_mp_qc)*vcvs + theta_b0(i_mp_qs)*vsvs(k) &
4482  + sigma_s + sigma_c )
4483  coef_acc_ncs = &
4484  ( delta_b0(i_mp_qc)*dcdc(k) + delta_ab0(i_mp_qs,i_mp_qc)*dcds + delta_b0(i_mp_qs)*dsds(k) ) &
4485  * sqrt( theta_b0(i_mp_qc)*vcvc(k) - theta_ab0(i_mp_qs,i_mp_qc)*vcvs + theta_b0(i_mp_qs)*vsvs(k) &
4486  + sigma_s + sigma_c )
4487  pac(k,i_lsaclc2ls)= -0.25_rp*pi*e_sc*rhoq(k,i_ns)*rhoq(k,i_qc)*coef_acc_lcs
4488  pac(k,i_nsacnc2ns)= -0.25_rp*pi*e_sc*rhoq(k,i_ns)*rhoq(k,i_nc)*coef_acc_ncs
4489  end do
4490 
4491  ! cloud-graupel => graupel
4492  ! reduction term of cloud
4493  do k = ks, ke
4494  dcdg = dq_xave(k,i_mp_qc) * dq_xave(k,i_mp_qg)
4495  vcvg = vt_xave(k,i_mp_qc,2) * vt_xave(k,i_mp_qg,2)
4496  ave_dg = coef_d(i_mp_qg)*xq(k,i_mp_qg)**b_m(i_mp_qg)
4497  sw = 0.5_rp - sign(0.5_rp, dg0-ave_dg) ! if(ave_dg>dg0)then sw=1
4498  e_g = e_gm * sw
4499  e_gc = e_g*e_c(k)
4500  coef_acc_lcg = &
4501  ( delta_b1(i_mp_qc)*dcdc(k) + delta_ab1(i_mp_qg,i_mp_qc)*dcdg + delta_b0(i_mp_qg)*dgdg(k) ) &
4502  * sqrt( theta_b1(i_mp_qc)*vcvc(k) - theta_ab1(i_mp_qg,i_mp_qc)*vcvg + theta_b0(i_mp_qg)*vgvg(k) &
4503  + sigma_g + sigma_c )
4504  coef_acc_ncg = &
4505  ( delta_b0(i_mp_qc)*dcdc(k) + delta_ab0(i_mp_qg,i_mp_qc)*dcdg + delta_b0(i_mp_qg)*dgdg(k) ) &
4506  * sqrt( theta_b0(i_mp_qc)*vcvc(k) - theta_ab0(i_mp_qg,i_mp_qc)*vcvg + theta_b0(i_mp_qg)*vgvg(k) &
4507  + sigma_g + sigma_c )
4508  pac(k,i_lgaclc2lg)= -0.25_rp*pi*e_gc*rhoq(k,i_ng)*rhoq(k,i_qc)*coef_acc_lcg
4509  pac(k,i_ngacnc2ng)= -0.25_rp*pi*e_gc*rhoq(k,i_ng)*rhoq(k,i_nc)*coef_acc_ncg
4510  end do
4511 
4512  ! snow-graupel => graupel
4513  do k = ks, ke
4514  dsdg = dq_xave(k,i_mp_qs) * dq_xave(k,i_mp_qg)
4515  vsvg = vt_xave(k,i_mp_qs,2) * vt_xave(k,i_mp_qg,2)
4516  coef_acc_lsg = &
4517  ( delta_b1(i_mp_qs)*dsds(k) + delta_ab1(i_mp_qg,i_mp_qs)*dsdg + delta_b0(i_mp_qg)*dgdg(k) ) &
4518  * sqrt( theta_b1(i_mp_qs)*vsvs(k) - theta_ab1(i_mp_qg,i_mp_qs)*vsvg + theta_b0(i_mp_qg)*vgvg(k) &
4519  + sigma_g + sigma_s )
4520  coef_acc_nsg(k) = &
4521  ( delta_b0(i_mp_qs)*dsds(k) + delta_ab0(i_mp_qg,i_mp_qs)*dsdg + delta_b0(i_mp_qg)*dgdg(k) ) &
4522  ! [fix] T.Mitsui 08/05/08
4523  * sqrt( theta_b0(i_mp_qs)*vsvs(k) - theta_ab0(i_mp_qg,i_mp_qs)*vsvg + theta_b0(i_mp_qg)*vgvg(k) &
4524  + sigma_g + sigma_s )
4525  pac(k,i_lgacls2lg)= -0.25_rp*pi*e_stick(k)*e_gs*rhoq(k,i_ng)*rhoq(k,i_qs)*coef_acc_lsg
4526  pac(k,i_ngacns2ng)= -0.25_rp*pi*e_stick(k)*e_gs*rhoq(k,i_ng)*rhoq(k,i_ns)*coef_acc_nsg(k)
4527  end do
4528 
4529  !-----------------
4530  ! (start) Y.Sato added on 2018/8/31
4531  !--- ice-graupel => graupel
4532 !!$ do k = KS, KE
4533 !!$ didg = dq_xave(k,I_mp_QI) * dq_xave(k,I_mp_QG)
4534 !!$ vivg = vt_xave(k,I_mp_QI,2) * vt_xave(k,I_mp_QG,2)
4535 !!$ coef_acc_LIG = &
4536 !!$ ( delta_b1(I_QI)*didi(k) + delta_ab1(I_QG,I_QI)*didg + delta_b0(I_QG)*dgdg(k) ) &
4537 !!$ * sqrt( theta_b1(I_QI)*vivi(k) - theta_ab1(I_QG,I_QI)*vivg + theta_b0(I_QG)*vgvg(k) &
4538 !!$ + sigma_g + sigma_i )
4539 !!$ coef_acc_NIG(k) = &
4540 !!$ ( delta_b0(I_QI)*didi(k) + delta_ab0(I_QG,I_QI)*didg + delta_b0(I_QG)*dgdg(k) ) &
4541 !!$ * sqrt( theta_b0(I_QI)*vivi(k) - theta_ab0(I_QG,I_QI)*vivg + theta_b0(I_QG)*vgvg(k) &
4542 !!$ + sigma_g + sigma_i )
4543 !!$ Pac(k,I_LGacLI2LG)= -0.25_RP*pi*E_stick(k)*E_gi*rhoq(k,I_NG)*rhoq(k,I_QI)*coef_acc_LIG*flg_igcol
4544 !!$ Pac(k,I_NGacNI2NG)= -0.25_RP*pi*E_stick(k)*E_gi*rhoq(k,I_NG)*rhoq(k,I_NI)*coef_acc_NIG(k)*flg_igcol
4545 !!$ end do
4546 
4547  !------------------------------------------------------------------------
4548  ! ice-snow => snow
4549  ! reduction term of ice
4550  do k = ks, ke
4551  dids = dq_xave(k,i_mp_qi) * dq_xave(k,i_mp_qs)
4552  vivs = vt_xave(k,i_mp_qi,2) * vt_xave(k,i_mp_qs,2)
4553  coef_acc_lis = &
4554  ( delta_b1(i_mp_qi)*didi(k) + delta_ab1(i_mp_qs,i_mp_qi)*dids + delta_b0(i_mp_qs)*dsds(k) ) &
4555  * sqrt( theta_b1(i_mp_qi)*vivi(k) - theta_ab1(i_mp_qs,i_mp_qi)*vivs + theta_b0(i_mp_qs)*vsvs(k) &
4556  + sigma_i + sigma_s )
4557  coef_acc_nis = &
4558  ( delta_b0(i_mp_qi)*didi(k) + delta_ab0(i_mp_qs,i_mp_qi)*dids + delta_b0(i_mp_qs)*dsds(k) ) &
4559  * sqrt( theta_b0(i_mp_qi)*vivi(k) - theta_ab0(i_mp_qs,i_mp_qi)*vivs + theta_b0(i_mp_qs)*vsvs(k) &
4560  + sigma_i + sigma_s )
4561  pac(k,i_liacls2ls)= -0.25_rp*pi*e_stick(k)*e_si*rhoq(k,i_ns)*rhoq(k,i_qi)*coef_acc_lis
4562  pac(k,i_niacns2ns)= -0.25_rp*pi*e_stick(k)*e_si*rhoq(k,i_ns)*rhoq(k,i_ni)*coef_acc_nis
4563  end do
4564 
4565  do k = ks, ke
4566  drdg = dq_xave(k,i_mp_qr) * dq_xave(k,i_mp_qg)
4567  vrvg = vt_xave(k,i_mp_qr,2) * vt_xave(k,i_mp_qg,2)
4568  sw = sign(0.5_rp, t00-tem(k)) + 0.5_rp
4569  ! if ( tem(k) <= T00 )then
4570  ! rain-graupel => graupel
4571  ! reduction term of rain
4572  ! sw = 1
4573  ! else
4574  ! rain-graupel => rain
4575  ! reduction term of graupel
4576  ! sw = 0
4577  coef_acc_lrg = &
4578  ( ( delta_b1(i_mp_qr)*drdr(k) + delta_ab1(i_mp_qg,i_mp_qr)*drdg + delta_b0(i_mp_qg)*dgdg(k) ) * sw &
4579  + ( delta_b1(i_mp_qg)*dgdg(k) + delta_ab1(i_mp_qr,i_mp_qg)*drdg + delta_b0(i_mp_qr)*drdr(k) ) * (1.0_rp-sw) ) &
4580  * sqrt( ( theta_b1(i_mp_qr)*vrvr(k) - theta_ab1(i_mp_qg,i_mp_qr)*vrvg + theta_b0(i_mp_qg)*vgvg(k) ) * sw &
4581  + ( theta_b1(i_mp_qg)*vgvg(k) - theta_ab1(i_mp_qr,i_mp_qg)*vrvg + theta_b0(i_mp_qr)*vrvr(k) ) * (1.0_rp-sw) &
4582  + sigma_r + sigma_g )
4583  pac(k,i_lraclg2lg) = -0.25_rp*pi*e_gr*coef_acc_lrg * ( rhoq(k,i_ng)*rhoq(k,i_qr) * sw &
4584  + rhoq(k,i_nr)*rhoq(k,i_qg) * (1.0_rp-sw) )
4585  coef_acc_nrg = &
4586  ( delta_b0(i_mp_qr)*drdr(k) + delta_ab0(i_mp_qg,i_mp_qr)*drdg + delta_b0(i_mp_qg)*dgdg(k) ) &
4587  * sqrt( theta_b0(i_mp_qr)*vrvr(k) - theta_ab0(i_mp_qg,i_mp_qr)*vrvg + theta_b0(i_mp_qg)*vgvg(k) &
4588  + sigma_r + sigma_g )
4589  pac(k,i_nracng2ng) = -0.25_rp*pi*e_gr*rhoq(k,i_ng)*rhoq(k,i_nr)*coef_acc_nrg
4590  end do
4591 
4592  !------------------------------------------------------------------------
4593  !
4594  !+++ pattern 2: a + b => c (a>b)
4595  ! (r-i,r-s)
4596  !------------------------------------------------------------------------
4597 
4598  ! rain-ice => graupel
4599  ! reduction term of ice
4600  do k = ks, ke
4601  coef_acc_lri_i = &
4602  ( delta_b1(i_mp_qi)*didi(k) + delta_ab1(i_mp_qr,i_mp_qi)*drdi(k) + delta_b0(i_mp_qr)*drdr(k) ) &
4603  * sqrt( theta_b1(i_mp_qi)*vivi(k) - theta_ab1(i_mp_qr,i_mp_qi)*vrvi(k) + theta_b0(i_mp_qr)*vrvr(k) &
4604  + sigma_r + sigma_i )
4605  coef_acc_nri_i = &
4606  ( delta_b0(i_mp_qi)*didi(k) + delta_ab0(i_mp_qr,i_mp_qi)*drdi(k) + delta_b0(i_mp_qr)*drdr(k) ) &
4607  * sqrt( theta_b0(i_mp_qi)*vivi(k) - theta_ab0(i_mp_qr,i_mp_qi)*vrvi(k) + theta_b0(i_mp_qr)*vrvr(k) &
4608  + sigma_r + sigma_i )
4609  pac(k,i_lracli2lg_i)= -0.25_rp*pi*e_ir*rhoq(k,i_nr)*rhoq(k,i_qi)*coef_acc_lri_i
4610  pac(k,i_nracni2ng_i)= -0.25_rp*pi*e_ir*rhoq(k,i_nr)*rhoq(k,i_ni)*coef_acc_nri_i
4611  end do
4612 
4613  ! reduction term of rain
4614  do k = ks, ke
4615  coef_acc_lri_r = &
4616  ( delta_b1(i_mp_qr)*drdr(k) + delta_ab1(i_mp_qi,i_mp_qr)*drdi(k) + delta_b0(i_mp_qi)*didi(k) ) &
4617  * sqrt( theta_b1(i_mp_qr)*vrvr(k) - theta_ab1(i_mp_qi,i_mp_qr)*vrvi(k) + theta_b0(i_mp_qi)*vivi(k) &
4618  + sigma_r + sigma_i )
4619  coef_acc_nri_r = &
4620  ( delta_b0(i_mp_qr)*drdr(k) + delta_ab0(i_mp_qi,i_mp_qr)*drdi(k) + delta_b0(i_mp_qi)*didi(k) ) &
4621  * sqrt( theta_b0(i_mp_qr)*vrvr(k) - theta_ab0(i_mp_qi,i_mp_qr)*vrvi(k) + theta_b0(i_mp_qi)*vivi(k) &
4622  + sigma_r + sigma_i )
4623  pac(k,i_lracli2lg_r)= -0.25_rp*pi*e_ir*rhoq(k,i_ni)*rhoq(k,i_qr)*coef_acc_lri_r
4624  pac(k,i_nracni2ng_r)= -0.25_rp*pi*e_ir*rhoq(k,i_ni)*rhoq(k,i_nr)*coef_acc_nri_r
4625  end do
4626 
4627  ! rain-snow => graupel
4628  ! reduction term of snow
4629  do k = ks, ke
4630  coef_acc_lrs_s = &
4631  ( delta_b1(i_mp_qs)*dsds(k) + delta_ab1(i_mp_qr,i_mp_qs)*drds(k) + delta_b0(i_mp_qr)*drdr(k) ) &
4632  * sqrt( theta_b1(i_mp_qs)*vsvs(k) - theta_ab1(i_mp_qr,i_mp_qs)*vrvs(k) + theta_b0(i_mp_qr)*vrvr(k) &
4633  + sigma_r + sigma_s )
4634  coef_acc_nrs_s = &
4635  ( delta_b0(i_mp_qs)*dsds(k) + delta_ab0(i_mp_qr,i_mp_qs)*drds(k) + delta_b0(i_mp_qr)*drdr(k) ) &
4636  * sqrt( theta_b0(i_mp_qs)*vsvs(k) - theta_ab0(i_mp_qr,i_mp_qs)*vrvs(k) + theta_b0(i_mp_qr)*vrvr(k) &
4637  + sigma_r + sigma_s )
4638  pac(k,i_lracls2lg_s)= -0.25_rp*pi*e_sr*rhoq(k,i_nr)*rhoq(k,i_qs)*coef_acc_lrs_s
4639  pac(k,i_nracns2ng_s)= -0.25_rp*pi*e_sr*rhoq(k,i_nr)*rhoq(k,i_ns)*coef_acc_nrs_s
4640  end do
4641 
4642  ! reduction term of rain
4643  do k = ks, ke
4644  coef_acc_lrs_r = &
4645  ( delta_b1(i_mp_qr)*drdr(k) + delta_ab1(i_mp_qs,i_mp_qr)*drds(k) + delta_b0(i_mp_qs)*dsds(k) ) &
4646  * sqrt( theta_b1(i_mp_qr)*vrvr(k) - theta_ab1(i_mp_qs,i_mp_qr)*vrvs(k) + theta_b0(i_mp_qs)*vsvs(k) &
4647  + sigma_r + sigma_s )
4648  coef_acc_nrs_r = &
4649  ( delta_b0(i_mp_qr)*drdr(k) + delta_ab0(i_mp_qs,i_mp_qr)*drds(k) + delta_b0(i_mp_qs)*dsds(k) ) &
4650  * sqrt( theta_b0(i_mp_qr)*vrvr(k) - theta_ab0(i_mp_qs,i_mp_qr)*vrvs(k) + theta_b0(i_mp_qs)*vsvs(k) &
4651  + sigma_r + sigma_s )
4652  pac(k,i_lracls2lg_r)= -0.25_rp*pi*e_sr*rhoq(k,i_ns)*rhoq(k,i_qr)*coef_acc_lrs_r
4653  pac(k,i_nracns2ng_r)= -0.25_rp*pi*e_sr*rhoq(k,i_ns)*rhoq(k,i_nr)*coef_acc_nrs_r
4654  end do
4655 
4656  !------------------------------------------------------------------------
4657  !
4658  !+++ pattern 3: a + a => b (i-i)
4659  !
4660  !------------------------------------------------------------------------
4661 
4662  ! ice-ice ( reduction is double, but includes double-count)
4663  do k = ks, ke
4664  coef_acc_lii = &
4665  ( delta_b0(i_mp_qi)*didi(k) + delta_ab1(i_mp_qi,i_mp_qi)*didi(k) + delta_b1(i_mp_qi)*didi(k) ) &
4666  * sqrt( theta_b0(i_mp_qi)*vivi(k) - theta_ab1(i_mp_qi,i_mp_qi)*vivi(k) + theta_b1(i_mp_qi)*vivi(k) &
4667  + sigma_i + sigma_i )
4668  coef_acc_nii = &
4669  ( delta_b0(i_mp_qi)*didi(k) + delta_ab0(i_mp_qi,i_mp_qi)*didi(k) + delta_b0(i_mp_qi)*didi(k) ) &
4670  * sqrt( theta_b0(i_mp_qi)*vivi(k) - theta_ab0(i_mp_qi,i_mp_qi)*vivi(k) + theta_b0(i_mp_qi)*vivi(k) &
4671  + sigma_i + sigma_i )
4672  pac(k,i_liacli2ls)= -0.25_rp*pi*e_stick(k)*e_ii*rhoq(k,i_ni)*rhoq(k,i_qi)*coef_acc_lii
4673  pac(k,i_niacni2ns)= -0.25_rp*pi*e_stick(k)*e_ii*rhoq(k,i_ni)*rhoq(k,i_ni)*coef_acc_nii
4674 
4675 ! ci_aut(k) = 0.25_RP*pi*E_ii*rhoq(k,I_NI)*coef_acc_LII
4676 ! taui_aut(k) = 1._RP/max(E_stick(k)*ci_aut(k),1.E-10_RP)
4677 ! tau_sce(k) = rhoq(k,I_QI)/max(rhoq(k,I_QIj)+rhoq(k,I_QS),1.E-10_RP)
4678  end do
4679 
4680  !------------------------------------------------------------------------
4681  !
4682  !+++ pattern 4: a + a => a (s-s)
4683  !
4684  !------------------------------------------------------------------------
4685 
4686  ! snow-snow => snow
4687  do k = ks, ke
4688  coef_acc_nss = &
4689  ( delta_b0(i_mp_qs)*dsds(k) + delta_ab0(i_mp_qs,i_mp_qs)*dsds(k) + delta_b0(i_mp_qs)*dsds(k) ) &
4690  * sqrt( theta_b0(i_mp_qs)*vsvs(k) - theta_ab0(i_mp_qs,i_mp_qs)*vsvs(k) + theta_b0(i_mp_qs)*vsvs(k) &
4691  + sigma_s + sigma_s )
4692  pac(k,i_nsacns2ns)= -0.125_rp*pi*e_stick(k)*e_ss*rhoq(k,i_ns)*rhoq(k,i_ns)*coef_acc_nss
4693  end do
4694 
4695  ! graupel-grauple => graupel
4696  do k = ks, ke
4697  coef_acc_ngg = &
4698  ( delta_b0(i_mp_qg)*dgdg(k) + delta_ab0(i_mp_qg,i_mp_qg)*dgdg(k) + delta_b0(i_mp_qg)*dgdg(k) ) &
4699  * sqrt( theta_b0(i_mp_qg)*vgvg(k) - theta_ab0(i_mp_qg,i_mp_qg)*vgvg(k) + theta_b0(i_mp_qg)*vgvg(k) &
4700  + sigma_g + sigma_g )
4701  pac(k,i_ngacng2ng)= -0.125_rp*pi*e_stick(k)*e_gg*rhoq(k,i_ng)*rhoq(k,i_ng)*coef_acc_ngg
4702  end do
4703 
4704  !------------------------------------------------------------------------
4705  !--- Partial conversion
4706  ! SB06(70),(71)
4707  ! i_iconv2g: option whether partial conversions work or not
4708 
4709  ! ice-cloud => graupel
4710  do k = ks, ke
4711  sw = 0.5_rp - sign(0.5_rp,di_cri-ave_di(k)) ! if( ave_di > di_cri )then sw=1
4712  wx_cri = cfill_i*dwatr/rho_g*( pi/6.0_rp*rho_g*ave_di(k)**3/xq(k,i_mp_qi) - 1.0_rp ) * sw
4713  pq(k,i_licon) = i_iconv2g * pac(k,i_liaclc2li)/max(1.0_rp, wx_cri) * sw
4714  pq(k,i_nicon) = i_iconv2g * pq(k,i_licon)/xq(k,i_mp_qi) * sw
4715  end do
4716 
4717  ! snow-cloud => graupel
4718  do k = ks, ke
4719  wx_crs = cfill_s*dwatr/rho_g*( pi/6.0_rp*rho_g*ave_ds(k)**3/xq(k,i_mp_qs) - 1.0_rp )
4720  pq(k,i_lscon) = i_sconv2g * (pac(k,i_lsaclc2ls))/max(1.0_rp, wx_crs)
4721  pq(k,i_nscon) = i_sconv2g * pq(k,i_lscon)/xq(k,i_mp_qs)
4722  end do
4723 
4724  !--- enhanced melting( due to collection-freezing of water droplets )
4725  ! originally from Rutledge and Hobbs(1984). eq.(A.21)
4726  ! if T > 273.15 then temc_p=T-273.15, else temc_p=0
4727  ! 08/05/08 [fix] T.Mitsui LHF00 => LHF0
4728  ! melting occurs around T=273K, so LHF0 is suitable both SIMPLE and EXACT,
4729  ! otherwise LHF can have sign both negative(EXACT) and positive(SIMPLE).
4730  do k = ks, ke
4731 ! temc_m = min(tem(k) - T00, 0.0_RP) ! T < 273.15
4732  temc_p = max(tem(k) - t00, 0.0_rp) ! T > 273.15
4733 !!$ coef_emelt = -CL/LHF00*temc_p
4734  coef_emelt = cl/lhf0*temc_p
4735  ! cloud-graupel
4736  pq(k,i_lgacm) = coef_emelt*pac(k,i_lgaclc2lg)
4737  pq(k,i_ngacm) = pq(k,i_lgacm)/xq(k,i_mp_qg)
4738  ! rain-graupel
4739  pq(k,i_lgarm) = coef_emelt*pac(k,i_lraclg2lg)
4740  pq(k,i_ngarm) = pq(k,i_lgarm)/xq(k,i_mp_qg)
4741  ! cloud-snow
4742  pq(k,i_lsacm) = coef_emelt*(pac(k,i_lsaclc2ls))
4743  pq(k,i_nsacm) = pq(k,i_lsacm)/xq(k,i_mp_qs)
4744  ! rain-snow
4745  pq(k,i_lsarm) = coef_emelt*(pac(k,i_lracls2lg_r)+pac(k,i_lracls2lg_s))
4746  pq(k,i_nsarm) = pq(k,i_lsarm)/xq(k,i_mp_qg)
4747  ! cloud-ice
4748  pq(k,i_liacm) = coef_emelt*pac(k,i_liaclc2li)
4749  pq(k,i_niacm) = pq(k,i_liacm)/xq(k,i_mp_qi)
4750  ! rain-ice
4751  pq(k,i_liarm) = coef_emelt*(pac(k,i_lracli2lg_r)+pac(k,i_lracli2lg_i))
4752  pq(k,i_niarm) = pq(k,i_liarm)/xq(k,i_mp_qg)
4753  end do
4754 
4755 
4756  !---- for charge density
4757  if ( flg_lt ) then
4758  !--- C + I -> I (decrease from cloud charge)
4759  do k = ks, ke
4760  sw1 = 0.5_rp - sign( 0.5_rp, rhoq(k,i_nc)-small ) !--- if NC is small, ignore charge transfer
4761  pcrg2(k,i_niacnc2ni) = pac(k,i_niacnc2ni)*(1.0_rp-sw1) / (rhoq(k,i_nc)+sw1) * rhoq_crg(k,i_qc)
4762  end do
4763 
4764  !--- C + S -> S (decrease from cloud charge)
4765  do k = ks, ke
4766  sw1 = 0.5_rp - sign( 0.5_rp, rhoq(k,i_nc)-small ) !--- if NC is small, ignore charge transfer
4767  pcrg2(k,i_nsacnc2ns) = pac(k,i_nsacnc2ns)*(1.0_rp-sw1) / (rhoq(k,i_nc)+sw1) * rhoq_crg(k,i_qc)
4768  end do
4769 
4770  !--- C + G -> G (decrease from cloud charge)
4771  do k = ks, ke
4772  sw1 = 0.5_rp - sign( 0.5_rp, rhoq(k,i_nc)-small ) !--- if NC is small, ignore charge transfer
4773  pcrg2(k,i_ngacnc2ng) = pac(k,i_ngacnc2ng)*(1.0_rp-sw1) / (rhoq(k,i_nc)+sw1) * rhoq_crg(k,i_qc)
4774  end do
4775 
4776  !--- S + G -> G (decrease from snow charge)
4777  do k = ks, ke
4778  sw1 = 0.5_rp - sign( 0.5_rp, rhoq(k,i_ns)-small ) !--- if NS is small, ignore charge transfer
4779  pcrg2(k,i_ngacns2ng) = pac(k,i_ngacns2ng)*(1.0_rp-sw1) / (rhoq(k,i_ns)+sw1) * rhoq_crg(k,i_qs)
4780  end do
4781 
4782  !--- Charge separation by Snow-Graupel rebound--------------------------------
4783  do k = ks, ke
4784  alpha_lt = 5.0_rp * ( dq_xave(k,i_mp_qs) / d0_crg )**2 * vt_xave(k,i_mp_qg,2) / v0_crg
4785  alpha_lt = min( alpha_lt, 10.0_rp )
4786  pcrg2(k,i_cgngacns2ng)= 0.25_rp*pi*( 1.0_rp - e_stick(k) )*e_gs &
4787  * rhoq(k,i_ng)*rhoq(k,i_ns)*coef_acc_nsg(k) &
4788  * ( dqcrg(k)*alpha_lt ) &
4789  * beta_crg(k)
4790  end do
4791 
4792  !--- I + G -> G (decrease from snow charge)
4793 !!$ do k = KS, KE
4794 !!$ sw1 = 0.5_RP - sign( 0.5_RP, rhoq(k,I_NI)-SMALL ) !--- if NS is small, ignore charge transfer
4795 !!$ Pcrg2(k,I_NGacNI2NG) = Pac(k,I_NGacNI2NG)*(1.0_RP-sw1) / (rhoq(k,I_NI)+sw1) * rhoq_crg(k,I_QI) * flg_igcol
4796 !!$ !--- Charge separation by Ice-Graupel rebound--------------------------------
4797 !!$ alpha_lt = 5.0_RP * ( dq_xave(k,I_mp_QI) / d0_crg )**2 * vt_xave(k,I_mp_QG,2) / v0_crg
4798 !!$ alpha_lt = min( alpha_lt, 10.0_RP )
4799 !!$ Pcrg2(k,I_CGNGacNI2NG)= 0.25_RP*pi*( 1.0_RP - E_stick(k) )*E_gi &
4800 !!$ * rhoq(k,I_NG)*rhoq(k,I_NI)*coef_acc_NIG(k) &
4801 !!$ * ( dqcrg(k)*alpha_lt ) &
4802 !!$ * beta_crg(k) * flg_igcol
4803 !!$ end do
4804 
4805  !--- I + S -> S (decrease from ice charge)
4806  do k = ks, ke
4807  sw1 = 0.5_rp - sign( 0.5_rp, rhoq(k,i_ni)-small ) !--- if NI is small, ignore charge transfer
4808  pcrg2(k,i_niacns2ns) = pac(k,i_niacns2ns)*(1.0_rp-sw1) / (rhoq(k,i_ni)+sw1) * rhoq_crg(k,i_qi)
4809  end do
4810 
4811  !--- R+G->R (T>T00 sw=0, decrease from graupel charge), ->G(T<=T00 sw=1, dcrerase from rain charge)
4812  do k = ks, ke
4813  sw = 0.5_rp + sign( 0.5_rp, t00-tem(k) )
4814  sw1 = 0.5_rp - sign( 0.5_rp, rhoq(k,i_nr)-small ) !--- if NR is small, ignore charge transfer
4815  sw2 = 0.5_rp - sign( 0.5_rp, rhoq(k,i_ng)-small ) !--- if NG is small, ignore charge transfer
4816  pcrg2(k,i_nracng2ng) = pac(k,i_nracng2ng)*(1.0_rp-sw1)/(rhoq(k,i_nr)+sw1) * rhoq_crg(k,i_qr) * sw &
4817  + pac(k,i_nracng2ng)*(1.0_rp-sw2)/(rhoq(k,i_ng)+sw2) * rhoq_crg(k,i_qg) * (1.0_rp-sw)
4818  end do
4819 
4820  !--- R + I -> G (decrease from both ice and rain charge, but only ice charge at this part)
4821  do k = ks, ke
4822  sw1 = 0.5_rp - sign( 0.5_rp, rhoq(k,i_ni)-small ) !--- if NI is small, ignore charge transfer
4823  pcrg2(k,i_nracni2ng_i) = pac(k,i_nracni2ng_i)*(1.0_rp-sw1) / (rhoq(k,i_ni)+sw1) * rhoq_crg(k,i_qi)
4824  end do
4825 
4826  !--- R + I -> G (decrease from both ice and rain charge, but only rain charge at this part)
4827  do k = ks, ke
4828  sw1 = 0.5_rp - sign( 0.5_rp, rhoq(k,i_nr)-small ) !--- if NR is small, ignore charge transfer
4829  pcrg2(k,i_nracni2ng_r) = pac(k,i_nracni2ng_r)*(1.0_rp-sw1) / (rhoq(k,i_nr)+sw1) * rhoq_crg(k,i_qr)
4830  end do
4831 
4832  !--- R + S -> G (decrease from both snow and rain charge, but only snow charge at this part)
4833  do k = ks, ke
4834  sw1 = 0.5_rp - sign( 0.5_rp, rhoq(k,i_ns)-small ) !--- if NS is small, ignore charge transfer
4835  pcrg2(k,i_nracns2ng_s) = pac(k,i_nracns2ng_s)*(1.0_rp-sw1) / (rhoq(k,i_ns)+sw1) * rhoq_crg(k,i_qs)
4836  end do
4837 
4838  !--- R + S -> G (decrease from both snow and rain charge, but only rain charge at this part)
4839  do k = ks, ke
4840  sw1 = 0.5_rp - sign( 0.5_rp, rhoq(k,i_nr)-small ) !--- if NR is small, ignore charge transfer
4841  pcrg2(k,i_nracns2ng_r) = pac(k,i_nracns2ng_r)*(1.0_rp-sw1) / (rhoq(k,i_nr)+sw1) * rhoq_crg(k,i_qr)
4842  end do
4843 
4844  !--- I + I -> S (decrease from ice charge)
4845  do k = ks, ke
4846  sw1 = 0.5_rp - sign( 0.5_rp, rhoq(k,i_ni)-small ) !--- if NI is small, ignore charge transfer
4847  pcrg2(k,i_niacni2ns) = pac(k,i_niacni2ns)*(1.0_rp-sw1) / (rhoq(k,i_ni)+sw1) * rhoq_crg(k,i_qi)
4848  end do
4849 
4850  !--- I + C -> G (decrease from ice charge)
4851  do k = ks, ke
4852  sw1 = 0.5_rp - sign( 0.5_rp, rhoq(k,i_ni)-small ) !--- if NI is small, ignore charge transfer
4853  pcrg1(k,i_nicon) = i_iconv2g * pq(k,i_nicon)*(1.0_rp-sw1) / (rhoq(k,i_ni)+sw1) * rhoq_crg(k,i_qi)
4854  end do
4855 
4856  !--- S + C -> G (decrease from snow charge)
4857  do k = ks, ke
4858  sw1 = 0.5_rp - sign( 0.5_rp, rhoq(k,i_ns)-small ) !--- if NS is small, ignore charge transfer
4859  pcrg1(k,i_nscon) = i_sconv2g * pq(k,i_nscon)*(1.0_rp-sw1) / (rhoq(k,i_ns)+sw1) * rhoq_crg(k,i_qs)
4860  end do
4861 
4862  do k = ks, ke
4863  sw1 = 0.5_rp - sign( 0.5_rp, rhoq(k,i_ng)-small ) !--- if NG is small, ignore charge transfer
4864  pcrg1(k,i_ngacm) = pq(k,i_ngacm)*(1.0_rp-sw1) / (rhoq(k,i_ng)+sw1) * rhoq_crg(k,i_qg)
4865  end do
4866 
4867  do k = ks, ke
4868  sw1 = 0.5_rp - sign( 0.5_rp, rhoq(k,i_ng)-small ) !--- if NG is small, ignore charge transfer
4869  pcrg1(k,i_ngarm) = pq(k,i_ngarm)*(1.0_rp-sw1) / (rhoq(k,i_ng)+sw1) * rhoq_crg(k,i_qg)
4870  end do
4871 
4872  do k = ks, ke
4873  sw1 = 0.5_rp - sign( 0.5_rp, rhoq(k,i_ns)-small ) !--- if NS is small, ignore charge transfer
4874  pcrg1(k,i_nsacm) = pq(k,i_nsacm)*(1.0_rp-sw1) / (rhoq(k,i_ns)+sw1) * rhoq_crg(k,i_qs)
4875  end do
4876 
4877  do k = ks, ke
4878  sw1 = 0.5_rp - sign( 0.5_rp, rhoq(k,i_ns)-small ) !--- if NS is small, ignore charge transfer
4879  pcrg1(k,i_nsarm) = pq(k,i_nsarm)*(1.0_rp-sw1) / (rhoq(k,i_ns)+sw1) * rhoq_crg(k,i_qs)
4880  end do
4881 
4882  do k = ks, ke
4883  sw1 = 0.5_rp - sign( 0.5_rp, rhoq(k,i_ni)-small ) !--- if NI is small, ignore charge transfer
4884  pcrg1(k,i_niacm) = pq(k,i_niacm)*(1.0_rp-sw1) / (rhoq(k,i_ni)+sw1) * rhoq_crg(k,i_qi)
4885  end do
4886 
4887  do k = ks, ke
4888  sw1 = 0.5_rp - sign( 0.5_rp, rhoq(k,i_ni)-small ) !--- if NI is small, ignore charge transfer
4889  pcrg1(k,i_niarm) = pq(k,i_niarm)*(1.0_rp-sw1) / (rhoq(k,i_ni)+sw1) * rhoq_crg(k,i_qi)
4890  end do
4891 
4892  end if
4893 
4894  return
4895  end subroutine mixed_phase_collection
4896 
4897 !OCL SERIAL
4899  ! collection process
4900  KA, KS, KE, & ! in
4901  flg_lt, & ! in
4902  d0_crg, v0_crg, & ! in
4903  beta_crg, dqcrg, & ! in
4904  wtem, rhoq, rhoq_crg, & ! in
4905  xq, dq_xave, vt_xave, & ! in
4906  rho, & ! in
4907  PQ, & ! inout
4908  Pcrg1, Pcrg2, & ! inout
4909  Pac ) ! out
4910  use scale_atmos_saturation, only: &
4911  moist_psat_ice => atmos_saturation_psat_ice
4912  use scale_prc, only: &
4913  prc_abort
4914  implicit none
4915 
4916  integer, intent(in) :: KA, KS, KE
4917 
4918  !--- mixed-phase collection process
4919  ! And all we set all production term as a negative sign to avoid confusion.
4920  !
4921  real(RP), intent(in) :: wtem(KA)
4922  !--- mass/number concentration[kg/m3]
4923  real(RP), intent(in) :: rhoq(KA,I_QV:I_NG)
4924  real(RP), intent(in) :: rho(KA) ! air density
4925  ! necessary ?
4926  real(RP), intent(in) :: xq(KA,HYDRO_MAX)
4927  !--- diameter of averaged mass( D(ave x) )
4928  real(RP), intent(in) :: dq_xave(KA,HYDRO_MAX)
4929  !--- terminal velocity of averaged mass( vt(ave x) )
4930  real(RP), intent(in) :: vt_xave(KA,HYDRO_MAX,2)
4931  ! [Add] 11/08/30 T.Mitsui, for autoconversion of ice
4932  ! real(RP), intent(in) :: rho(KA)
4933  !--- partial conversion
4934  real(RP), intent(inout):: PQ(KA,PQ_MAX)
4935  !
4936  real(RP), intent(out):: Pac(KA,Pac_MAX)
4937  !--- for lightning component
4938  logical, intent(in) :: flg_lt
4939  real(RP), intent(in) :: beta_crg(KA)
4940  real(RP), intent(in) :: dqcrg(KA)
4941  real(RP), intent(in) :: d0_crg, v0_crg
4942  real(RP), intent(in) :: rhoq_crg(KA,I_QC:I_QG)
4943  real(RP), intent(inout):: Pcrg1(KA,PQ_MAX)
4944  real(RP), intent(inout):: Pcrg2(KA,Pcrg_MAX)
4945 
4946  real(RP), parameter :: a_dec = 0.883_rp
4947  real(RP), parameter :: b_dec = 0.093_rp
4948  real(RP), parameter :: c_dec = 0.00348_rp
4949  real(RP), parameter :: d_dec = 4.5185e-5_rp
4950  !
4951  !!!!from default SN14
4952 
4953  real(RP), parameter :: E_C12(6)=(/&
4954  0.010_rp, 0.080_rp, 0.10_rp, 0.60_rp, 0.20_rp, 0.10_rp/)
4955 
4956  real(RP) :: tem(KA)
4957  !
4958  !--- collection efficency of each specie
4959  real(RP) :: E_c, E_r, E_i, E_s, E_g
4960 ! real(RP) :: E_ic, E_sc, E_gc
4961  !--- sticking efficiency
4962  real(RP):: E_stick(KA)
4963  ! [Add] 10/08/03 T.Mitsui
4964  real(RP) :: temc, temc2, temc3
4965  real(RP) :: E_dec
4966  real(RP) :: esi_rat(KA)
4967  real(RP) :: esi(KA)
4968  !
4969  real(RP) :: temc_p, temc_m ! celcius tem.
4970 ! real(RP) :: ci_aut(KA)
4971 ! real(RP) :: taui_aut(KA)
4972 ! real(RP) :: tau_sce(KA)
4973  !--- DSD averaged diameter for each species
4974  real(RP) :: ave_dc ! cloud
4975 ! real(RP) :: ave_dr ! rain
4976  real(RP) :: ave_di(KA) ! ice
4977  real(RP) :: ave_ds(KA) ! snow
4978  real(RP) :: ave_dg ! graupel
4979  !--- coefficient of collection equations(L:mass, N:number)
4980  real(RP) :: coef_acc_LCI, coef_acc_NCI ! cloud - cloud ice
4981  real(RP) :: coef_acc_LCS, coef_acc_NCS ! cloud - snow
4982  !
4983  real(RP) :: coef_acc_LCG, coef_acc_NCG ! cloud - graupel
4984  real(RP) :: coef_acc_LRI_I, coef_acc_NRI_I ! rain - cloud ice
4985  real(RP) :: coef_acc_LRI_R, coef_acc_NRI_R ! rain - cloud ice
4986  real(RP) :: coef_acc_LRS_S, coef_acc_NRS_S ! rain - snow
4987  real(RP) :: coef_acc_LRS_R, coef_acc_NRS_R ! rain - snow
4988  real(RP) :: coef_acc_LRG, coef_acc_NRG ! rain - graupel
4989  real(RP) :: coef_acc_LII, coef_acc_NII ! cloud ice - cloud ice
4990  real(RP) :: coef_acc_LIS, coef_acc_NIS ! cloud ice - snow
4991  real(RP) :: coef_acc_NSS ! snow - snow
4992  real(RP) :: coef_acc_NGG ! grauepl - graupel
4993  real(RP) :: coef_acc_LSG, coef_acc_NSG(KA) ! snow - graupel
4994  !--- (diameter) x (diameter)
4995  real(RP) :: dcdc(KA), dcdi, dcds, dcdg
4996  real(RP) :: drdr(KA), drdi(KA), drds(KA), drdg
4997  real(RP) :: didi(KA), dids, didg
4998  real(RP) :: dsds(KA), dsdg
4999  real(RP) :: dgdg(KA)
5000 !# !--- (terminal velocity) x (terminal velocity)
5001 !# real(RP) :: vcvc(KA), vcvi, vcvs, vcvg
5002 !# real(RP) :: vrvr(KA), vrvi(KA), vrvs(KA), vrvg
5003 !# real(RP) :: vivi(KA), vivs, vivg
5004 !# real(RP) :: vsvs(KA), vsvg
5005 !# real(RP) :: vgvg(KA)
5006  !
5007 ! real(RP) :: wx_cri, wx_crs
5008 ! real(RP) :: coef_emelt
5009 ! real(RP) :: w1
5010 
5011  real(RP) :: sw, sw1, sw2, tmp
5012  real(RP) :: alpha_lt
5013  !
5014  integer :: k, iqw
5015  !
5016 
5017  real(RP) :: tem_e(KA) ! [Add] 15/05/19 T.Seiki
5018 
5019 
5020  !
5021  ! work for binary collision
5022  !
5023  ! work for Gauss-Legendre quadrature
5024  integer, parameter :: ngmax=4
5025 
5026  real(RP) :: lambdac(KA), lambdar(KA), lambdai(KA), lambdas(KA), lambdag(KA)
5027  real(RP) :: A_dsdc(KA), A_dsdr(KA), A_dsdi(KA), A_dsds(KA), A_dsdg(KA)
5028  real(RP) :: dNdx
5029  real(RP) :: dxdd
5030  real(RP) :: dNdD
5031  real(RP) :: dNc_glx(KA,ngmax), dNr_glx(KA,ngmax), dNi_glx(KA,ngmax), dNs_glx(KA,ngmax), dNg_glx(KA,ngmax)
5032  real(RP) :: dNc_gly, dNr_gly(KA,ngmax), dNi_gly(KA,ngmax), dNs_gly(KA,ngmax), dNg_gly(KA,ngmax)
5033  !
5034  real(RP) :: dc_glx, dr_glx, di_glx, ds_glx, dg_glx
5035  real(RP) :: dc_gly, dr_gly, di_gly, ds_gly, dg_gly
5036  real(RP) :: xc_glx(KA,ngmax), xr_glx(KA,ngmax), xi_glx(KA,ngmax), xs_glx(KA,ngmax), xg_glx(KA,ngmax)
5037  real(RP) :: xc_gly, xr_gly(KA,ngmax), xi_gly, xs_gly, xg_gly
5038 
5039  real(RP) :: vtc_glx(KA,ngmax), vtr_glx(KA,ngmax), vti_glx(KA,ngmax), vts_glx(KA,ngmax), vtg_glx(KA,ngmax)
5040  real(RP) :: vtc_gly, vtr_gly(KA,ngmax), vti_gly(KA,ngmax), vts_gly(KA,ngmax), vtg_gly(KA,ngmax)
5041  real(RP) :: dac_glx(KA,ngmax), dar_glx(KA,ngmax), dai_glx(KA,ngmax), das_glx(KA,ngmax), dag_glx(KA,ngmax)
5042  real(RP) :: dac_gly, dar_gly(KA,ngmax), dai_gly(KA,ngmax), das_gly(KA,ngmax), dag_gly(KA,ngmax)
5043  !
5044  integer :: ngx, ngy
5045  !
5046  real(RP) :: E_ic(KA), E_sc(KA), E_gc(KA)
5047  !
5048  ! Parameters to calculate terminal velocity formulated by Mitchell (1996)
5049  !
5050  real(RP) :: acx, bcx, gcx, scx ! geometric parameters of hexagonal column ice defined by Mitchell (1996)
5051  real(RP) :: acy, bcy, gcy, scy ! geometric parameters of hexagonal column ice defined by Mitchell (1996)
5052  real(RP), parameter :: as = 0.59452551_rp
5053  real(RP), parameter :: bs = 2.4490_rp
5054  real(RP), parameter :: gs = 0.131488_rp
5055  real(RP), parameter :: ss = 1.880000_rp
5056  real(RP), parameter :: ag = 19.5072514_rp !0.049d0*1.d-3*(100.0d0**2.8d0)
5057  real(RP), parameter :: bg = 2.8_rp
5058  real(RP), parameter :: gg = 0.5_rp
5059  real(RP), parameter :: sg = 2.0_rp
5060  real(RP) :: num_Besti_glx, num_Bests_glx, num_Bestg_glx
5061  real(RP) :: num_Besti_gly, num_Bests_gly, num_Bestg_gly
5062  real(RP) :: num_Rei_glx, num_Res_glx, num_Reg_glx
5063  real(RP) :: num_Rei_gly, num_Res_gly, num_Reg_gly
5064  real(RP), parameter :: c0=0.6_rp ! Bohm (1989)
5065  real(RP), parameter :: d0=5.83_rp ! Bohm (1989)
5066  !
5067  real(RP) :: mua(KA), nua(KA)
5068  !--- Dynamic viscosity
5069  real(RP), parameter :: mua0 = 1.718e-5_rp
5070 
5071  real(RP), parameter :: dmua_dT = 5.28e-8_rp
5072 
5073  !====== mua = mua0 + temc*dmua_dT
5074  !
5075  ! collection Kernel
5076  !
5077  real(RP) :: kernel_cg, kernel_cs, kernel_ci
5078  real(RP) :: kernel_rg, kernel_rs, kernel_ri
5079  real(RP) :: kernel_ig, kernel_is, kernel_ii
5080  real(RP) :: kernel_sg, kernel_ss
5081  real(RP) :: kernel_gg
5082  real(RP) :: kernel_sg_reb
5083  !
5084  !--------------------------
5085  !
5086  ! accurate for PSDs with optimization
5087  !
5088  !-------------------------------
5089  ! cloud
5090  ! gauss_range = 2.0_RP
5091  ! ngmax = 4
5092  ! rain,
5093  ! gauss_range = xxx
5094  ! ngmax = 4
5095  ! ice, snow, graupel
5096  ! gauss_range = 5.0_RP
5097  ! ngmax = 4
5098  !
5099  real(RP), parameter :: gauss_rangec=2.0_rp
5100  real(RP), parameter :: wc_gl(ngmax)=(/&
5101  0.2411146051511425e+00_rp, &
5102  0.4520325754088027e+00_rp, &
5103  0.4520325754088027e+00_rp, &
5104  0.2411146051511425e+00_rp &
5105  /)
5106  real(RP), parameter :: coefc_d_gl(ngmax)=(/&
5107  0.5505187813766612e+00_rp, &
5108  0.7900516927471093e+00_rp, &
5109  0.1265739962562290e+01_rp, &
5110  0.1816468454535444e+01_rp &
5111  /)
5112  real(RP), parameter :: gauss_ranger=8.0_rp
5113  real(RP), parameter :: wr_gl(ngmax)=(/&
5114  0.723343815453428e+00_rp,&
5115  1.35609772622641e+00_rp, &
5116  1.35609772622641e+00_rp, &
5117  0.723343815453428e+00_rp &
5118  /)
5119  real(RP), parameter :: coefr_d_gl(ngmax)=(/&
5120  0.166846238310235e+00_rp, &
5121  0.493135790663523e+00_rp, &
5122  2.02783902311062e+00_rp, &
5123  5.99354237846583e+00_rp &
5124  /)
5125  real(RP), parameter :: gauss_range=5.0_rp
5126  real(RP), parameter :: w_gl(ngmax)=(/&
5127  0.559850775788111e+00_rp, &
5128  1.04958713664599e+00_rp, &
5129  1.04958713664599e+00_rp, &
5130  0.559850775788111e+00_rp &
5131  /)
5132  real(RP), parameter :: coef_d_gl(ngmax)=(/&
5133  0.2500872485877803e+00_rp, &
5134  0.5785800417604080e+00_rp, &
5135  0.1728369331505741e+01_rp, &
5136  0.3998604509613778e+01_rp &
5137  /)
5138  !
5139  real(RP) :: wx_cri, wx_crs
5140  real(RP) :: coef_emelt
5141  real(RP) :: w1
5142 ! integer :: ij, k
5143  integer :: ierr
5144 
5145  !---------------------------------------------------------------------------
5146  !
5147  !
5148 
5149  do k = ks, ke
5150  tem(k) = max( wtem(k), tem_min ) ! 11/08/30 T.Mitsui
5151  end do
5152 
5153  call moist_psat_ice( ka, ks, ke, &
5154  tem(:), esi(:) ) ! [IN], [OUT]
5155 
5156  if( opt_stick_ks96 )then
5157  do k = ks, ke
5158  ! Khain and Sednev (1996), eq.(3.15)
5159  temc = tem(k) - t00
5160  temc2 = temc*temc
5161  temc3 = temc2*temc
5162  e_dec = max(0.0_rp, a_dec + b_dec*temc + c_dec*temc2 + d_dec*temc3 )
5163  esi_rat(k) = rhoq(k,i_qv)*rvap*tem(k)/esi(k)
5164  e_stick(k) = min(1.0_rp, e_dec*esi_rat(k))
5165  end do
5166  else if( opt_stick_co86 )then
5167  do k = ks, ke
5168  ! [Add] 11/08/30 T.Mitsui, Cotton et al. (1986)
5169  temc = min(tem(k) - t00,0.0_rp)
5170  w1 = 0.035_rp*temc-0.7_rp
5171  e_stick(k) = 10._rp**w1
5172  end do
5173  else
5174  do k = ks, ke
5175  ! Lin et al. (1983)
5176  temc_m = min(tem(k) - t00,0.0_rp) ! T < 273.15
5177  e_stick(k) = exp(0.09_rp*temc_m)
5178  end do
5179  end if
5180 
5181  !------------------------------------------------------------------------
5182 
5183 
5184  pac(:,:) = 0.0_rp
5185 
5186  tem(:) = max(wtem(:), tem_min )
5187  tem_e(:) = max(wtem(:), tem_min_estick )
5188 
5189  call moist_psat_ice( ka, ks, ke, tem(:), esi(:) )
5190 
5191 
5192  if ( opt_stick_ks96 ) then
5193  do k=ks, ke
5194  ! Khain and Sednev (1996), eq.(3.15)
5195  temc = tem_e(k) - t00 ![Mod] 15/05/19 T.Seiki
5196  temc2 = temc*temc
5197  temc3 = temc2*temc
5198  e_dec = max(0.0_rp, a_dec + b_dec*temc + c_dec*temc2 + d_dec*temc3 )
5199  esi_rat(k) = rhoq(k,i_qv)*rvap*tem(k)/esi(k)
5200  e_stick(k) = min(1.0_rp, e_dec*esi_rat(k))
5201  enddo
5202  elseif( opt_stick_co86 ) then
5203  do k=ks, ke
5204  temc = min(tem_e(k) - t00,0.0_rp)
5205  w1 = 0.035_rp*temc-0.7_rp
5206  e_stick(k) = 10.0_rp**w1
5207  enddo
5208  elseif( opt_stick_c12 ) then
5209  do k=ks, ke
5210  if (tem_e(k)>273.15_rp) then
5211  e_stick(k)=1.0_rp
5212  elseif(tem_e(k)<243.15_rp) then !-30degC
5213  e_stick(k)=e_c12(1)
5214  elseif(tem_e(k)<248.15_rp) then !-25degC
5215  e_stick(k)=e_c12(1)+0.2_rp*(e_c12(2)-e_c12(1))*(tem_e(k)-243.15_rp)
5216  elseif(tem_e(k)<253.15_rp) then !-20degC
5217  e_stick(k)=e_c12(2)+0.2_rp*(e_c12(3)-e_c12(2))*(tem_e(k)-248.15_rp)
5218  elseif(tem_e(k)<258.15_rp) then !-15degC
5219  e_stick(k)=e_c12(3)+0.2_rp*(e_c12(4)-e_c12(3))*(tem_e(k)-253.15_rp)
5220  elseif(tem_e(k)<263.15_rp) then !-10degC
5221  e_stick(k)=e_c12(4)+0.2_rp*(e_c12(5)-e_c12(4))*(tem_e(k)-258.15_rp)
5222  elseif(tem_e(k)<268.15_rp) then !- 5degC
5223  e_stick(k)=e_c12(5)+0.2_rp*(e_c12(6)-e_c12(5))*(tem_e(k)-263.15_rp)
5224  else ! 0degC
5225  e_stick(k)=e_c12(6)
5226  endif
5227  enddo
5228  else
5229  if ( opt_stick_rhh57 ) then
5230  do k=ks, ke
5231  if ( tem_e(k) < 270.0_rp .AND. rhoq(k,i_qv)*rvap*tem(k) < esi(k) ) then
5232  esi_rat(k) = 0.0_rp
5233  else
5234  esi_rat(k) = 1.0_rp
5235  endif
5236  enddo
5237  elseif( opt_stick_rhks96 ) then
5238  do k=ks, ke
5239  esi_rat(k) = min( rhoq(k,i_qv)*rvap*tem(k)/esi(k),1.0_rp )
5240  enddo
5241  else
5242  esi_rat(:) = 1.0_rp
5243  endif
5244  !
5245  do k=ks, ke
5246  ! Lin et al. (1983)
5247  temc_m = min(tem_e(k) - t00,0.0_rp) ! T < 273.15
5248  e_stick(k) = exp(0.09_rp*temc_m)*esi_rat(k)
5249  enddo
5250  endif
5251 
5252  !
5253  ! Integration Start
5254  !
5255 
5256  do k = ks, ke
5257  mua(k) = mua0 + dmua_dt*(tem(k)-273.15_rp)
5258  nua(k) = mua(k)/rho(k) ! [m2/s]
5259  end do
5260  do k = ks, ke
5261  lambdac(k) = xq(k,i_mp_qc)**(-mu(i_mp_qc))*coef_lambda(i_mp_qc)
5262  a_dsdc(k) = rhoq(k,i_nc)*coef_a(i_mp_qc)*lambdac(k)**((nu(i_mp_qc)+1.0_rp)/mu(i_mp_qc))
5263  end do
5264  do k = ks, ke
5265  lambdar(k) = xq(k,i_mp_qr)**(-mu(i_mp_qr))*coef_lambda(i_mp_qr)
5266  a_dsdr(k) = rhoq(k,i_nr)*coef_a(i_mp_qr)*lambdar(k)**((nu(i_mp_qr)+1.0_rp)/mu(i_mp_qr))
5267  end do
5268  do k = ks, ke
5269  lambdai(k) = xq(k,i_mp_qi)**(-mu(i_mp_qi))*coef_lambda(i_mp_qi)
5270  a_dsdi(k) = rhoq(k,i_ni)*coef_a(i_mp_qi)*lambdai(k)**((nu(i_mp_qi)+1.0_rp)/mu(i_mp_qi))
5271  end do
5272  do k = ks, ke
5273  lambdas(k) = xq(k,i_mp_qs)**(-mu(i_mp_qs))*coef_lambda(i_mp_qs)
5274  a_dsds(k) = rhoq(k,i_ns)*coef_a(i_mp_qs)*lambdas(k)**((nu(i_mp_qs)+1.0_rp)/mu(i_mp_qs))
5275  end do
5276  do k = ks, ke
5277  lambdag(k) = xq(k,i_mp_qg)**(-mu(i_mp_qg))*coef_lambda(i_mp_qg)
5278  a_dsdg(k) = rhoq(k,i_ng)*coef_a(i_mp_qg)*lambdag(k)**((nu(i_mp_qg)+1.0_rp)/mu(i_mp_qg))
5279  end do
5280 
5281  !
5282  ! Particle X
5283  !
5284  do ngx=1, ngmax ! X < Y
5285 !OCL LOOP_FISSION_TARGET(LS)
5286  do k = ks, ke
5287  dc_glx = dq_xave(k,i_mp_qc)*coefc_d_gl(ngx)
5288  xc_glx(k,ngx) = ( (dc_glx/a_m(i_mp_qc)) )**(1.0_rp/b_m(i_mp_qc))
5289  dnc_glx(k,ngx) = a_dsdc(k)*(xc_glx(k,ngx)**nu(i_mp_qc)) * exp(-lambdac(k)*xc_glx(k,ngx)**mu(i_mp_qc))&
5290  *(xc_glx(k,ngx)/(b_m(i_mp_qc)*dc_glx))*dc_glx*wc_gl(ngx) ! dNdlogD*weight
5291  !
5292  dr_glx = dq_xave(k,i_mp_qr)*coefr_d_gl(ngx)
5293  xr_glx(k,ngx) = ( (dr_glx/a_m(i_mp_qr)) )**(1.0_rp/b_m(i_mp_qr))
5294  dnr_glx(k,ngx) = a_dsdr(k)*(xr_glx(k,ngx)**nu(i_mp_qr)) * exp(-lambdar(k)*xr_glx(k,ngx)**mu(i_mp_qr))&
5295  *(xr_glx(k,ngx)/(b_m(i_mp_qr)*dr_glx))*dr_glx*wr_gl(ngx) ! dNdlogD*weight
5296  !
5297  di_glx = dq_xave(k,i_mp_qi)*coef_d_gl(ngx)
5298  xi_glx(k,ngx) = ( (di_glx/a_m(i_mp_qi)) )**(1.0_rp/b_m(i_mp_qi))
5299  dni_glx(k,ngx) = a_dsdi(k)*(xi_glx(k,ngx)**nu(i_mp_qi)) * exp(-lambdai(k)*xi_glx(k,ngx)**mu(i_mp_qi))&
5300  *(xi_glx(k,ngx)/(b_m(i_mp_qi)*di_glx))*di_glx*w_gl(ngx) ! dNdlogD*weight
5301  !
5302  ds_glx = dq_xave(k,i_mp_qs)*coef_d_gl(ngx)
5303  xs_glx(k,ngx) = ( (ds_glx/a_m(i_mp_qs)) )**(1.0_rp/b_m(i_mp_qs))
5304  dns_glx(k,ngx) = a_dsds(k)*(xs_glx(k,ngx)**nu(i_mp_qs)) * exp(-lambdas(k)*xs_glx(k,ngx)**mu(i_mp_qs))&
5305  *(xs_glx(k,ngx)/(b_m(i_mp_qs)*ds_glx))*ds_glx*w_gl(ngx)! dNdlogD*weight
5306  !
5307  dg_glx = dq_xave(k,i_mp_qg)*coef_d_gl(ngx)
5308  xg_glx(k,ngx) = ( (dg_glx/a_m(i_mp_qg)) )**(1.0_rp/b_m(i_mp_qg))
5309  dng_glx(k,ngx) = a_dsdg(k)*(xg_glx(k,ngx)**nu(i_mp_qg)) * exp(-lambdag(k)*xg_glx(k,ngx)**mu(i_mp_qg))&
5310  *(xg_glx(k,ngx)/(b_m(i_mp_qg)*dg_glx))*dg_glx*w_gl(ngx)! dNdlogD*weight
5311  !
5312  ! Hexagonal Columns
5313 !!$ if( di_glx <= 100.e-6_RP )then
5314 !!$ acx = 0.1677_RP*1.e-3_RP*(100.0_RP**2.91_RP)
5315 !!$ bcx = 2.91_RP
5316 !!$ gcx = (0.684_RP*1.e-4_RP)*10.0_RP**(2.0_RP*2.0_RP)
5317 !!$ scx = 2.0_RP
5318 !!$ else
5319 !!$ acx = 0.00166_RP*1.e-3_RP*(100.0_RP**1.91_RP)
5320 !!$ bcx = 1.91_RP
5321 !!$ gcx = (0.0696_RP*1.e-4_RP)*10.0_RP**(2.0_RP*1.5_RP)
5322 !!$ scx = 1.5_RP
5323 !!$ end if
5324  sw = 0.5_rp + sign(0.5_rp, di_glx - 100.e-6_rp )
5325  acx = ( 0.1677_rp*(1.0_rp-sw) + 0.00166_rp*sw ) * 1.e-3_rp * 100.0_rp**( 2.91_rp*(1.0_rp-sw) + 1.91_rp*sw )
5326  bcx = 2.91_rp*(1.0_rp-sw) + 1.91_rp*sw
5327  gcx = (0.684_rp*(1.0_rp-sw) + 0.0696_rp*sw ) * 1.e-4_rp * 10.0_rp**( 4.0_rp*(1.0_rp-sw) + 3.0_rp*sw )
5328  scx = 2.0_rp*(1.0_rp-sw) + 1.5_rp*sw
5329  num_besti_glx = 2.0_rp*acx*grav*rho(k)*di_glx**(bcx+2.0_rp-scx)/(gcx*mua(k)**2)
5330  num_bests_glx = 2.0_rp*as *grav*rho(k)*ds_glx**(bs +2.0_rp-ss )/(gs *mua(k)**2)
5331  num_bestg_glx = 2.0_rp*ag *grav*rho(k)*dg_glx**(bg +2.0_rp-sg )/(gg *mua(k)**2)
5332  num_rei_glx = 0.25_rp*d0*d0*( sqrt(1.0_rp+4.0_rp*sqrt(num_besti_glx)/(d0*d0*sqrt(c0)))-1.0_rp )**2
5333  num_res_glx = 0.25_rp*d0*d0*( sqrt(1.0_rp+4.0_rp*sqrt(num_bests_glx)/(d0*d0*sqrt(c0)))-1.0_rp )**2
5334  num_reg_glx = 0.25_rp*d0*d0*( sqrt(1.0_rp+4.0_rp*sqrt(num_bestg_glx)/(d0*d0*sqrt(c0)))-1.0_rp )**2
5335  !
5336  vtc_glx(k,ngx) = coef_vtr_ar2*dc_glx*(1.0_rp-exp(-coef_vtr_br2*dc_glx))
5337  !
5338 !!$ if( dr_glx < d_vtr_branch )then
5339 !!$ vtr_glx = coef_vtr_ar2*dr_glx*(1.0_RP-exp(-coef_vtr_br2*dr_glx))
5340 !!$ else
5341 !!$ vtr_glx = coef_vtr_ar1-coef_vtr_br1*exp(-coef_vtr_cr1*dr_glx)
5342 !!$ end if
5343  sw = 0.5_rp + sign( 0.5_rp, dr_glx - d_vtr_branch )
5344  tmp = exp( - ( coef_vtr_br2*(1.0_rp-sw) + coef_vtr_cr1*sw ) * dr_glx )
5345  vtr_glx(k,ngx) = coef_vtr_ar2 * dr_glx * ( 1.0_rp - tmp ) * (1.0_rp-sw) &
5346  + ( coef_vtr_ar1 - coef_vtr_br1 * tmp ) * sw
5347  !
5348  vti_glx(k,ngx) = num_rei_glx*nua(k)/di_glx
5349  vts_glx(k,ngx) = num_res_glx*nua(k)/ds_glx
5350  vtg_glx(k,ngx) = num_reg_glx*nua(k)/dg_glx
5351  ! equivalent area diameter
5352  dac_glx(k,ngx) = dc_glx
5353  dar_glx(k,ngx) = dr_glx
5354  dai_glx(k,ngx) = 2.0_rp*sqrt( (gcx*di_glx**scx)/pi )
5355  das_glx(k,ngx) = 2.0_rp*sqrt( (gs *ds_glx**ss )/pi )
5356  dag_glx(k,ngx) = 2.0_rp*sqrt( (gg *dg_glx**sg )/pi )
5357  end do
5358  end do
5359 
5360  !
5361  ! Particle Y
5362  !
5363  do ngy=1, ngmax
5364 !OCL LOOP_FISSION_TARGET(LS)
5365  do k = ks, ke
5366  dr_gly = dq_xave(k,i_mp_qr)*coefr_d_gl(ngy)
5367  xr_gly(k,ngy) = ( (dr_gly/a_m(i_mp_qr)) )**(1.0_rp/b_m(i_mp_qr))
5368  dnr_gly(k,ngy) = a_dsdr(k)*(xr_gly(k,ngy)**nu(i_mp_qr)) * exp(-lambdar(k)*xr_gly(k,ngy)**mu(i_mp_qr))&
5369  *(xr_gly(k,ngy)/(b_m(i_mp_qr)*dr_gly))*dr_gly*wr_gl(ngy) ! dNdlogD*weight
5370  !
5371  di_gly = dq_xave(k,i_mp_qi)*coef_d_gl(ngy)
5372  xi_gly = ( (di_gly/a_m(i_mp_qi)) )**(1.0_rp/b_m(i_mp_qi))
5373  dni_gly(k,ngy) = a_dsdi(k)*(xi_gly**nu(i_mp_qi)) * exp(-lambdai(k)*xi_gly**mu(i_mp_qi))&
5374  *(xi_gly/(b_m(i_mp_qi)*di_gly))*di_gly*w_gl(ngy) ! dNdlogD*weight
5375  !
5376  ds_gly = dq_xave(k,i_mp_qs)*coef_d_gl(ngy)
5377  xs_gly = ( (ds_gly/a_m(i_mp_qs)) )**(1.0_rp/b_m(i_mp_qs))
5378  dns_gly(k,ngy) = a_dsds(k)*(xs_gly**nu(i_mp_qs)) * exp(-lambdas(k)*xs_gly**mu(i_mp_qs))&
5379  *(xs_gly/(b_m(i_mp_qs)*ds_gly))*ds_gly*w_gl(ngy)! dNdlogD*weight
5380  !
5381  dg_gly = dq_xave(k,i_mp_qg)*coef_d_gl(ngy)
5382  xg_gly = ( (dg_gly/a_m(i_mp_qg)) )**(1.0_rp/b_m(i_mp_qg))
5383  dng_gly(k,ngy) = a_dsdg(k)*(xg_gly**nu(i_mp_qg)) * exp(-lambdag(k)*xg_gly**mu(i_mp_qg))&
5384  *(xg_gly/(b_m(i_mp_qg)*dg_gly))*dg_gly*w_gl(ngy)! dNdlogD*weight
5385  !
5386  ! Hexagonal Columns
5387 !!$ if( di_gly <= 100.e-6_RP )then
5388 !!$ acy = 0.1677_RP*1.d-3*(100.0_RP**2.91_RP)
5389 !!$ bcy = 2.91_RP
5390 !!$ gcy = (0.684_RP*1.e-4_RP)*10.0_RP**(2.0_RP*2.0_RP)
5391 !!$ scy = 2.0_RP
5392 !!$ else
5393 !!$ acy = 0.00166_RP*1.e-3_RP*(100.0_RP**1.91_RP)
5394 !!$ bcy = 1.91_RP
5395 !!$ gcy = (0.0696_RP*1.e-4_RP)*10.0_RP**(2.0_RP*1.5_RP)
5396 !!$ scy = 1.5_RP
5397 !!$ end if
5398  sw = 0.5_rp + sign( 0.5_rp, di_gly - 100.e-6_rp )
5399  acy = ( 0.1677_rp*(1.0_rp-sw) + 0.00166_rp*sw ) * 1.e-3_rp * 100.0_rp**( 2.91_rp*(1.0_rp-sw) + 1.91_rp*sw )
5400  bcy = 2.91_rp*(1.0_rp-sw) + 1.91_rp*sw
5401  gcy = ( 0.684_rp*(1.0_rp-sw) + 0.0696_rp*sw ) * 1.e-4_rp * 10.0_rp**( 4.0_rp*(1.0_rp-sw) + 3.0_rp*sw )
5402  scy = 2.0_rp*(1.0_rp-sw) + 1.5_rp*sw
5403  num_besti_gly = 2.0_rp*acy*grav*rho(k)*di_gly**(bcy+2.0_rp-scy)/(gcy*mua(k)**2)
5404  num_bests_gly = 2.0_rp*as *grav*rho(k)*ds_gly**(bs +2.0_rp-ss )/(gs *mua(k)**2)
5405  num_bestg_gly = 2.0_rp*ag *grav*rho(k)*dg_gly**(bg +2.0_rp-sg )/(gg *mua(k)**2)
5406  num_rei_gly = 0.25_rp*d0*d0*( sqrt(1.0_rp+4.0_rp*sqrt(num_besti_gly)/(d0*d0*sqrt(c0)))-1.0_rp )**2
5407  num_res_gly = 0.25_rp*d0*d0*( sqrt(1.0_rp+4.0_rp*sqrt(num_bests_gly)/(d0*d0*sqrt(c0)))-1.0_rp )**2
5408  num_reg_gly = 0.25_rp*d0*d0*( sqrt(1.0_rp+4.0_rp*sqrt(num_bestg_gly)/(d0*d0*sqrt(c0)))-1.0_rp )**2
5409  !
5410 !!$ if( dr_gly < d_vtr_branch )then
5411 !!$ vtr_gly(k,ngy) = coef_vtr_ar2*dr_gly*(1.0_RP-exp(-coef_vtr_br2*dr_gly))
5412 !!$ else
5413 !!$ vtr_gly(k,ngy) = coef_vtr_ar1-coef_vtr_br1*exp(-coef_vtr_cr1*dr_gly)
5414 !!$ end if
5415  sw = 0.5_rp + sign( 0.5_rp, dr_gly - d_vtr_branch )
5416  tmp = exp( - ( coef_vtr_br2*(1.0_rp-sw) + coef_vtr_cr1*sw ) * dr_gly )
5417  vtr_gly(k,ngy) = coef_vtr_ar2 * dr_gly * ( 1.0_rp - tmp ) * (1.0_rp-sw) &
5418  + ( coef_vtr_ar1 - coef_vtr_br1 * tmp ) * sw
5419  !
5420  vti_gly(k,ngy) = num_rei_gly*nua(k)/di_gly
5421  vts_gly(k,ngy) = num_res_gly*nua(k)/ds_gly
5422  vtg_gly(k,ngy) = num_reg_gly*nua(k)/dg_gly
5423  ! equivalent area diameter
5424  dar_gly(k,ngy) = dr_gly
5425  dai_gly(k,ngy) = 2.0_rp*sqrt( (gcy*di_gly**scy)/pi )
5426  das_gly(k,ngy) = 2.0_rp*sqrt( (gs *ds_gly**ss )/pi )
5427  dag_gly(k,ngy) = 2.0_rp*sqrt( (gg *dg_gly**sg )/pi )
5428  end do
5429  end do
5430 
5431  !
5432  ! BULK collection efficiency are given as follows
5433  !
5434  do k = ks, ke
5435  e_c = max(0.0_rp, min(1.0_rp, (dq_xave(k,i_mp_qc)-dc0)/(dc1-dc0) ))
5436  !
5437 !!$ if (dq_xave(k,I_mp_QI)>di0) then
5438 !!$ E_i = E_im
5439 !!$ else
5440 !!$ E_i = 0.0_RP
5441 !!$ endif
5442  sw = 0.5_rp + sign( 0.5_rp, dq_xave(k,i_mp_qi)-di0 )
5443  e_i = e_im * sw
5444 !!$ if (dq_xave(k,I_mp_QS)>ds0) then
5445 !!$ E_s = E_sm
5446 !!$ else
5447 !!$ E_s = 0.0_RP
5448 !!$ endif
5449  sw = 0.5_rp + sign( 0.5_rp, dq_xave(k,i_mp_qs)-ds0 )
5450  e_s = e_sm * sw
5451 !!$ if (dq_xave(k,I_mp_QG)>dg0) then
5452 !!$ E_g = E_gm
5453 !!$ else
5454 !!$ E_g = 0.0_RP
5455 !!$ endif
5456  sw = 0.5_rp + sign( 0.5_rp, dq_xave(k,i_mp_qg)-dg0 )
5457  e_g = e_gm * sw
5458 
5459  e_ic(k) = e_i*e_c
5460  e_sc(k) = e_s*e_c
5461  e_gc(k) = e_g*e_c
5462  end do
5463 
5464 
5465  !=========================================================================================
5466  ! collection equation
5467  !=========================================================================================
5468  do ngx=1, ngmax ! X < Y
5469  do ngy=1, ngmax
5470 
5471  do k = ks, ke
5472  !
5473  ! 1.c-g (X=Cloud, Y=Graupel)
5474  !
5475 ! kernel_cg = 0.25_RP*pi*(dag_gly(k,ngy)+dac_glx(k,ngx))*(dag_gly(k,ngy)+dac_glx(k,ngx))*sqrt((vtg_gly(k,ngy)-vtc_glx(k,ngx))*(vtg_gly(k,ngy)-vtc_glx(k,ngx))) * E_gc(k)
5476  kernel_cg = 0.25_rp * pi * (dag_gly(k,ngy)+dac_glx(k,ngx))**2 * abs(vtg_gly(k,ngy)-vtc_glx(k,ngx)) * e_gc(k)
5477  pac(k,i_ngacnc2ng) = pac(k,i_ngacnc2ng) - kernel_cg *dnc_glx(k,ngx)*dng_gly(k,ngy)
5478  pac(k,i_lgaclc2lg) = pac(k,i_lgaclc2lg) - kernel_cg*xc_glx(k,ngx)*dnc_glx(k,ngx)*dng_gly(k,ngy)
5479  end do
5480  do k = ks, ke
5481  !
5482  ! 2.c-s (X=Cloud, Y=Snow)
5483  !
5484 ! kernel_cs = 0.25_RP*pi*(das_gly(k,ngy)+dac_glx(k,ngx))*(das_gly(k,ngy)+dac_glx(k,ngx))*sqrt((vts_gly(k,ngy)-vtc_glx(k,ngx))*(vts_gly(k,ngy)-vtc_glx(k,ngx))) * E_sc(k)
5485  kernel_cs = 0.25_rp * pi * (das_gly(k,ngy)+dac_glx(k,ngx))**2 * abs(vts_gly(k,ngy)-vtc_glx(k,ngx)) * e_sc(k)
5486  pac(k,i_nsacnc2ns) = pac(k,i_nsacnc2ns) - kernel_cs *dnc_glx(k,ngx)*dns_gly(k,ngy)
5487  pac(k,i_lsaclc2ls) = pac(k,i_lsaclc2ls) - kernel_cs*xc_glx(k,ngx)*dnc_glx(k,ngx)*dns_gly(k,ngy)
5488  end do
5489  do k = ks, ke
5490  !
5491  ! 3.c-i (X=Cloud, Y=Cloud Ice)
5492  !
5493 ! kernel_ci = 0.25_RP*pi*(dai_gly(k,ngy)+dac_glx(k,ngx))*(dai_gly(k,ngy)+dac_glx(k,ngx))*sqrt((vti_gly(k,ngy)-vtc_glx(k,ngx))*(vti_gly(k,ngy)-vtc_glx(k,ngx))) * E_ic(k)
5494  kernel_ci = 0.25_rp * pi * (dai_gly(k,ngy)+dac_glx(k,ngx))**2 * abs(vti_gly(k,ngy)-vtc_glx(k,ngx)) * e_ic(k)
5495  pac(k,i_niacnc2ni) = pac(k,i_niacnc2ni) - kernel_ci *dnc_glx(k,ngx)*dni_gly(k,ngy)
5496  pac(k,i_liaclc2li) = pac(k,i_liaclc2li) - kernel_ci*xc_glx(k,ngx)*dnc_glx(k,ngx)*dni_gly(k,ngy)
5497  end do
5498  do k = ks, ke
5499  !
5500  ! 4.r-g
5501  !
5502 ! kernel_rg = 0.25_RP*pi*(dag_gly(k,ngy)+dar_glx(k,ngx))*(dag_gly(k,ngy)+dar_glx(k,ngx))*sqrt((vtg_gly(k,ngy)-vtr_glx(k,ngx))*(vtg_gly(k,ngy)-vtr_glx(k,ngx))) * E_gr
5503  kernel_rg = 0.25_rp * pi * (dag_gly(k,ngy)+dar_glx(k,ngx))**2 * abs(vtg_gly(k,ngy)-vtr_glx(k,ngx)) * e_gr
5504  ! T < 273K (X=Rain , Y=Graupel)
5505  pac(k,i_nracng2ng) = pac(k,i_nracng2ng) - kernel_rg *dnr_glx(k,ngx)*dng_gly(k,ngy)
5506  pac(k,i_lraclg2lg) = pac(k,i_lraclg2lg) - kernel_rg*xr_glx(k,ngx)*dnr_glx(k,ngx)*dng_gly(k,ngy)
5507  ! T > 273K (X=Graupel, Y=Rain )
5508  pac(k,i_nracng2nr) = pac(k,i_nracng2nr) - kernel_rg *dng_glx(k,ngx)*dnr_gly(k,ngy)
5509  pac(k,i_lraclg2lr) = pac(k,i_lraclg2lr) - kernel_rg*xg_glx(k,ngx)*dng_glx(k,ngx)*dnr_gly(k,ngy)
5510  end do
5511  do k = ks, ke
5512  !
5513  ! 5.r-s
5514  !
5515 ! kernel_rs = 0.25_RP*pi*(das_glx(k,ngx)+dar_gly(k,ngy))*(das_glx(k,ngx)+dar_gly(k,ngy))*sqrt((vts_glx(k,ngx)-vtr_gly(k,ngy))*(vts_glx(k,ngx)-vtr_gly(k,ngy))) * E_sr
5516  kernel_rs = 0.25_rp * pi * (das_glx(k,ngx)+dar_gly(k,ngy))**2 * abs(vts_glx(k,ngx)-vtr_gly(k,ngy)) * e_sr
5517  ! (X=Snow, Y=Rain)
5518  pac(k,i_nracns2ng_r) = pac(k,i_nracns2ng_r) - kernel_rs *dns_glx(k,ngx)*dnr_gly(k,ngy)
5519  pac(k,i_lracls2lg_r) = pac(k,i_lracls2lg_r) - kernel_rs*xr_gly(k,ngy)*dns_glx(k,ngx)*dnr_gly(k,ngy)
5520  !
5521  pac(k,i_nracns2ng_s) = pac(k,i_nracns2ng_s) - kernel_rs *dns_glx(k,ngx)*dnr_gly(k,ngy)
5522  pac(k,i_lracls2lg_s) = pac(k,i_lracls2lg_s) - kernel_rs*xs_glx(k,ngx)*dns_glx(k,ngx)*dnr_gly(k,ngy)
5523  end do
5524  do k = ks, ke
5525  !
5526  ! 6.r-i
5527  !
5528 ! kernel_ri = 0.25_RP*pi*(dai_glx(k,ngx)+dar_gly(k,ngy))*(dai_glx(k,ngx)+dar_gly(k,ngy))*sqrt((vti_glx(k,ngx)-vtr_gly(k,ngy))*(vti_glx(k,ngx)-vtr_gly(k,ngy))) * E_ir
5529  kernel_ri = 0.25_rp * pi * (dai_glx(k,ngx)+dar_gly(k,ngy))**2 * abs(vti_glx(k,ngx)-vtr_gly(k,ngy)) * e_ir
5530  ! (X=Cloud Ice, Y=Rain)
5531  pac(k,i_nracni2ng_r) = pac(k,i_nracni2ng_r) - kernel_ri *dni_glx(k,ngx)*dnr_gly(k,ngy)
5532  pac(k,i_lracli2lg_r) = pac(k,i_lracli2lg_r) - kernel_ri*xr_gly(k,ngy)*dni_glx(k,ngx)*dnr_gly(k,ngy)
5533  !
5534  pac(k,i_nracni2ng_i) = pac(k,i_nracni2ng_i) - kernel_ri *dni_glx(k,ngx)*dnr_gly(k,ngy)
5535  pac(k,i_lracli2lg_i) = pac(k,i_lracli2lg_i) - kernel_ri*xi_glx(k,ngx)*dni_glx(k,ngx)*dnr_gly(k,ngy)
5536  end do
5537  do k = ks, ke
5538  !
5539  ! 7.i-g
5540  !
5541 ! kernel_ig = 0.25_RP*pi*(dai_glx(k,ngx)+dag_gly(k,ngy))*(dai_glx(k,ngx)+dag_gly(k,ngy))*sqrt((vti_glx(k,ngx)-vtg_gly(k,ngy))*(vti_glx(k,ngx)-vtg_gly(k,ngy))) * E_stick(k) * E_gi
5542  kernel_ig = 0.25_rp * pi * (dai_glx(k,ngx)+dag_gly(k,ngy))**2 * abs(vti_glx(k,ngx)-vtg_gly(k,ngy)) * e_stick(k) * e_gi
5543  pac(k,i_niacng2ng) = pac(k,i_niacng2ng) - kernel_ig *dni_glx(k,ngx)*dng_gly(k,ngy)
5544  pac(k,i_liaclg2lg) = pac(k,i_liaclg2lg) - kernel_ig*xi_glx(k,ngx)*dni_glx(k,ngx)*dng_gly(k,ngy)
5545  end do
5546  do k = ks, ke
5547  !
5548  ! 8.i-s
5549  !
5550 ! kernel_is = 0.25_RP*pi*(dai_glx(k,ngx)+das_gly(k,ngy))*(dai_glx(k,ngx)+das_gly(k,ngy))*sqrt((vti_glx(k,ngx)-vts_gly(k,ngy))*(vti_glx(k,ngx)-vts_gly(k,ngy))) * E_stick(k) * E_si
5551  kernel_is = 0.25_rp * pi * (dai_glx(k,ngx)+das_gly(k,ngy))**2 * abs(vti_glx(k,ngx)-vts_gly(k,ngy)) * e_stick(k) * e_si
5552  pac(k,i_niacns2ns) = pac(k,i_niacns2ns) - kernel_is *dni_glx(k,ngx)*dns_gly(k,ngy)
5553  pac(k,i_liacls2ls) = pac(k,i_liacls2ls) - kernel_is*xi_glx(k,ngx)*dni_glx(k,ngx)*dns_gly(k,ngy)
5554  end do
5555  do k = ks, ke
5556  !
5557  ! 9.i-i
5558  !
5559 ! kernel_ii = 0.25_RP*pi*(dai_glx(k,ngx)+dai_gly(k,ngy))*(dai_glx(k,ngx)+dai_gly(k,ngy))*sqrt((vti_glx(k,ngx)-vti_gly(k,ngy))*(vti_glx(k,ngx)-vti_gly(k,ngy))) * E_stick(k) * E_ii
5560  kernel_ii = 0.25_rp * pi * (dai_glx(k,ngx)+dai_gly(k,ngy))**2 * abs(vti_glx(k,ngx)-vti_gly(k,ngy)) * e_stick(k) * e_ii
5561  pac(k,i_niacni2ns) = pac(k,i_niacni2ns) - kernel_ii *dni_glx(k,ngx)*dni_gly(k,ngy)
5562  pac(k,i_liacli2ls) = pac(k,i_liacli2ls) - kernel_ii*xi_glx(k,ngx)*dni_glx(k,ngx)*dni_gly(k,ngy)
5563  end do
5564  do k = ks, ke
5565  !
5566  ! 10.s-g
5567  !
5568 ! kernel_sg = 0.25_RP*pi*(das_glx(k,ngx)+dag_gly(k,ngy))*(das_glx(k,ngx)+dag_gly(k,ngy))*sqrt((vts_glx(k,ngx)-vtg_gly(k,ngy))*(vts_glx(k,ngx)-vtg_gly(k,ngy))) * E_stick(k) * E_gs
5569  kernel_sg = 0.25_rp * pi * (das_glx(k,ngx)+dag_gly(k,ngy))**2 * abs(vts_glx(k,ngx)-vtg_gly(k,ngy)) * e_stick(k) * e_gs
5570  pac(k,i_ngacns2ng) = pac(k,i_ngacns2ng) - kernel_sg *dns_glx(k,ngx)*dng_gly(k,ngy)
5571  pac(k,i_lgacls2lg) = pac(k,i_lgacls2lg) - kernel_sg*xs_glx(k,ngx)*dns_glx(k,ngx)*dng_gly(k,ngy)
5572  end do
5573  do k = ks, ke
5574  !
5575  ! 11.s-s
5576  !
5577 ! kernel_ss = 0.125_RP*pi*(das_glx(k,ngx)+das_gly(k,ngy))*(das_glx(k,ngx)+das_gly(k,ngy))*sqrt((vts_glx(k,ngx)-vts_gly(k,ngy))*(vts_glx(k,ngx)-vts_gly(k,ngy))) * E_stick(k) * E_ss
5578  kernel_ss = 0.125_rp * pi * (das_glx(k,ngx)+das_gly(k,ngy))**2 * abs(vts_glx(k,ngx)-vts_gly(k,ngy)) * e_stick(k) * e_ss
5579  pac(k,i_nsacns2ns) = pac(k,i_nsacns2ns) - kernel_ss*dns_glx(k,ngx)*dns_gly(k,ngy)
5580  end do
5581  do k = ks, ke
5582  !
5583  ! 12.g-g
5584  !
5585 ! kernel_gg = 0.125_RP*pi*(dag_glx(k,ngx)+dag_gly(k,ngy))*(dag_glx(k,ngx)+dag_gly(k,ngy))*sqrt((vtg_glx(k,ngx)-vtg_gly(k,ngy))*(vtg_glx(k,ngx)-vtg_gly(k,ngy))) * E_stick(k) * E_gg
5586  kernel_gg = 0.125_rp * pi * (dag_glx(k,ngx)+dag_gly(k,ngy))**2 * abs(vtg_glx(k,ngx)-vtg_gly(k,ngy)) * e_stick(k) * e_gg
5587  pac(k,i_ngacng2ng) = pac(k,i_ngacng2ng) - kernel_gg*dng_glx(k,ngx)*dng_gly(k,ngy)
5588 
5589  end do
5590  end do
5591  end do
5592 
5593  !--- Charge separation by Snow-Graupel rebound--------------------------------
5594  if ( flg_lt ) then
5595  do k = ks, ke
5596 !OCL UNROLL('full')
5597  do ngy = 1, ngmax
5598 !OCL UNROLL('full')
5599  do ngx = 1, ngmax
5600  alpha_lt = 5.0_rp * ( das_glx(k,ngx) / d0_crg )**2*vtg_gly(k,ngy)/v0_crg
5601  alpha_lt = min( alpha_lt, 10.0_rp )
5602 ! kernel_sg_reb = 0.25_RP*pi*(das_glx(k,ngx)+dag_gly(k,ngy))*(das_glx(k,ngx)+dag_gly(k,ngy))*sqrt((vts_glx(k,ngx)-vtg_gly(k,ngy))*(vts_glx(k,ngx)-vtg_gly(k,ngy))) &
5603  kernel_sg_reb = 0.25_rp * pi * (das_glx(k,ngx)+dag_gly(k,ngy))**2 * abs(vts_glx(k,ngx)-vtg_gly(k,ngy)) &
5604  * ( 1.0_rp - e_stick(k) ) * e_gs
5605  pcrg2(k,i_cgngacns2ng) = pcrg2(k,i_cgngacns2ng) + kernel_sg_reb*dns_glx(k,ngx)*dng_gly(k,ngy)*dqcrg(k)*alpha_lt*beta_crg(k)
5606  end do
5607  end do
5608  end do
5609  end if
5610 
5611  !
5612  !
5613  do k=ks, ke
5614  temc_p = max(tem(k) - t00,0.0_rp) ! T > 273.15
5615  !------------------------------------------------------------------------
5616  !--- Partial conversion
5617  ! SB06(70),(71)
5618  ! i_iconv2g: option whether partial conversions work or not
5619  ! ice-cloud => graupel
5620  if ( dq_xave(k,i_mp_qi) > di_cri ) then
5621  wx_cri = cfill_i*rhow/rho_g*( pi/6.0_rp*rho_g*dq_xave(k,i_mp_qi)*dq_xave(k,i_mp_qi)*dq_xave(k,i_mp_qi)/xq(k,i_mp_qi) - 1.0_rp )
5622  pq(k,i_licon) = i_iconv2g* pac(k,i_liaclc2li)/max(1.0_rp, wx_cri)
5623  pq(k,i_nicon) = i_iconv2g* pq(k,i_licon)/xq(k,i_mp_qi)
5624  else
5625  wx_cri = 0.0_rp
5626  pq(k,i_licon) = 0.0_rp
5627  pq(k,i_nicon) = 0.0_rp
5628  endif
5629  ! snow-cloud => graupel
5630  wx_crs = cfill_s*rhow/rho_g*( pi/6.0_rp*rho_g*dq_xave(k,i_mp_qs)*dq_xave(k,i_mp_qs)*dq_xave(k,i_mp_qs)/xq(k,i_mp_qs) - 1.0_rp )
5631  pq(k,i_lscon) = i_sconv2g* (pac(k,i_lsaclc2ls))/max(1.0_rp, wx_crs)
5632  pq(k,i_nscon) = i_sconv2g* pq(k,i_lscon)/xq(k,i_mp_qs)
5633  !------------------------------------------------------------------------
5634  !--- enhanced melting( due to collection-freezing of water droplets )
5635  ! originally from Rutledge and Hobbs(1984). eq.(A.21)
5636  ! if T > 273.15 then temc_p=T-273.15, else temc_p=0
5637  ! 08/05/08 [fix] T.Mitsui LHF00 => LHF0
5638  ! melting occurs around T=273K, so LHF0 is suitable both SIMPLE and EXACT,
5639  ! otherwise LHF can have sign both negative(EXACT) and positive(SIMPLE).
5640  coef_emelt = cl/lhf0*temc_p
5641  ! cloud-graupel
5642  pq(k,i_lgacm) = coef_emelt*pac(k,i_lgaclc2lg)
5643  pq(k,i_ngacm) = pq(k,i_lgacm)/xq(k,i_mp_qg)
5644  ! rain-graupel
5645  pq(k,i_lgarm) = coef_emelt*pac(k,i_lraclg2lg)
5646  pq(k,i_ngarm) = pq(k,i_lgarm)/xq(k,i_mp_qg)
5647  ! cloud-snow
5648  pq(k,i_lsacm) = coef_emelt*(pac(k,i_lsaclc2ls))
5649  pq(k,i_nsacm) = pq(k,i_lsacm)/xq(k,i_mp_qs)
5650  ! rain-snow
5651  pq(k,i_lsarm) = coef_emelt*(pac(k,i_lracls2lg_r)+pac(k,i_lracls2lg_s))
5652  pq(k,i_nsarm) = pq(k,i_lsarm)/xq(k,i_mp_qg)
5653  ! cloud-ice
5654  pq(k,i_liacm) = coef_emelt*pac(k,i_liaclc2li)
5655  pq(k,i_niacm) = pq(k,i_liacm)/xq(k,i_mp_qi)
5656  ! rain-ice
5657  pq(k,i_liarm) = coef_emelt*(pac(k,i_lracli2lg_r)+pac(k,i_lracli2lg_i))
5658  pq(k,i_niarm) = pq(k,i_liarm)/xq(k,i_mp_qg)
5659  enddo
5660 
5661  !---- for charge density
5662  if ( flg_lt ) then
5663 
5664  ! 1.c-g (X=Cloud, Y=Graupel)
5665  do k = ks, ke
5666  sw1 = 0.5_rp - sign( 0.5_rp, rhoq(k,i_nc)-small )
5667  pcrg2(k,i_ngacnc2ng) = pac(k,i_ngacnc2ng)*(1.0_rp-sw1) / (rhoq(k,i_nc)+sw1) * rhoq_crg(k,i_qc)
5668  end do
5669 
5670  ! 2.c-s (X=Cloud, Y=Snow)
5671  do k = ks, ke
5672  sw1 = 0.5_rp - sign( 0.5_rp, rhoq(k,i_nc)-small )
5673  pcrg2(k,i_nsacnc2ns) = pac(k,i_nsacnc2ns)*(1.0_rp-sw1) / (rhoq(k,i_nc)+sw1) * rhoq_crg(k,i_qc)
5674  end do
5675 
5676  ! 3.c-i (X=Cloud, Y=Cloud Ice)
5677  do k = ks, ke
5678  sw1 = 0.5_rp - sign( 0.5_rp, rhoq(k,i_nc)-small )
5679  pcrg2(k,i_niacnc2ni) = pac(k,i_niacnc2ni)*(1.0_rp-sw1) / (rhoq(k,i_nc)+sw1) * rhoq_crg(k,i_qc)
5680  end do
5681 
5682  ! 4.r-g
5683  do k = ks, ke
5684  sw1 = 0.5_rp - sign( 0.5_rp, rhoq(k,i_nr)-small )
5685  sw2 = 0.5_rp - sign( 0.5_rp, rhoq(k,i_ng)-small )
5686  pcrg2(k,i_nracng2ng) = pac(k,i_nracng2ng)*(1.0_rp-sw1) / (rhoq(k,i_nr)+sw1) * rhoq_crg(k,i_qr)
5687  pcrg2(k,i_nracng2nr) = pac(k,i_nracng2nr)*(1.0_rp-sw2) / (rhoq(k,i_ng)+sw2) * rhoq_crg(k,i_qg)
5688  end do
5689 
5690  ! 5.r-s
5691  do k = ks, ke
5692  sw1 = 0.5_rp - sign( 0.5_rp, rhoq(k,i_nr)-small )
5693  sw2 = 0.5_rp - sign( 0.5_rp, rhoq(k,i_ns)-small )
5694  pcrg2(k,i_nracns2ng_r) = pac(k,i_nracns2ng_r)*(1.0_rp-sw1) / (rhoq(k,i_nr)+sw1) * rhoq_crg(k,i_qr)
5695  pcrg2(k,i_nracns2ng_s) = pac(k,i_nracns2ng_s)*(1.0_rp-sw2) / (rhoq(k,i_ns)+sw2) * rhoq_crg(k,i_qs)
5696  end do
5697 
5698 
5699  ! 6.r-i
5700  do k = ks, ke
5701  sw1 = 0.5_rp - sign( 0.5_rp, rhoq(k,i_nr)-small )
5702  sw2 = 0.5_rp - sign( 0.5_rp, rhoq(k,i_ni)-small )
5703  pcrg2(k,i_nracni2ng_r) = pac(k,i_nracni2ng_r)*(1.0_rp-sw1) / (rhoq(k,i_nr)+sw1) * rhoq_crg(k,i_qr)
5704  pcrg2(k,i_nracni2ng_i) = pac(k,i_nracni2ng_i)*(1.0_rp-sw2) / (rhoq(k,i_ni)+sw2) * rhoq_crg(k,i_qi)
5705  end do
5706 
5707  ! 7.i-g
5708  do k = ks, ke
5709  sw1 = 0.5_rp - sign( 0.5_rp, rhoq(k,i_ni)-small )
5710  pcrg2(k,i_niacng2ng) = pac(k,i_niacng2ng)*(1.0_rp-sw1) / (rhoq(k,i_ni)+sw1) * rhoq_crg(k,i_qi)
5711  end do
5712 
5713  ! 8.i-s
5714  do k = ks, ke
5715  sw1 = 0.5_rp - sign( 0.5_rp, rhoq(k,i_ni)-small )
5716  pcrg2(k,i_niacns2ns) = pac(k,i_niacns2ns)*(1.0_rp-sw1) / (rhoq(k,i_ni)+sw1) * rhoq_crg(k,i_qi)
5717  end do
5718 
5719  ! 9.i-i
5720  do k = ks, ke
5721  sw1 = 0.5_rp - sign( 0.5_rp, rhoq(k,i_ni)-small )
5722  pcrg2(k,i_niacni2ns) = pac(k,i_niacni2ns)*(1.0_rp-sw1) / (rhoq(k,i_ni)+sw1) * rhoq_crg(k,i_qi)
5723  end do
5724 
5725  ! 10.s-g
5726  do k = ks, ke
5727  sw1 = 0.5_rp - sign( 0.5_rp, rhoq(k,i_ns)-small )
5728  pcrg2(k,i_ngacns2ng) = pac(k,i_ngacns2ng)*(1.0_rp-sw1) / (rhoq(k,i_ns)+sw1) * rhoq_crg(k,i_qs)
5729  end do
5730 
5731  ! 11.s-s
5732  do k = ks, ke
5733  pcrg2(k,i_nsacns2ns) = 0.0_rp ! no charge transfer between category due to the collection of the same category (snow-snow)
5734  end do
5735 
5736  ! 12.g-g
5737  do k = ks, ke
5738  pcrg2(k,i_ngacng2ng) = 0.0_rp ! no charge transfer between category due to the collection of the same category (graupel-graupel)
5739  end do
5740 
5741  !--- Partial conversion
5742  ! ice-cloud => graupel
5743  do k = ks, ke
5744  sw1 = 0.5_rp - sign( 0.5_rp, rhoq(k,i_ni)-small )
5745  pcrg1(k,i_nicon) = pq(k,i_nicon)*(1.0_rp-sw1) / (rhoq(k,i_ni)+sw1) * rhoq_crg(k,i_qi)
5746  end do
5747 
5748  ! snow-cloud => graupel
5749  do k = ks, ke
5750  sw1 = 0.5_rp - sign( 0.5_rp, rhoq(k,i_ns)-small )
5751  pcrg1(k,i_nscon) = pq(k,i_nscon)*(1.0_rp-sw1) / (rhoq(k,i_ns)+sw1) * rhoq_crg(k,i_qs)
5752  end do
5753 
5754  !--- enhanced melting( due to collection-freezing of water droplets )
5755  ! cloud-graupel
5756  do k = ks, ke
5757  sw1 = 0.5_rp - sign( 0.5_rp, rhoq(k,i_ng)-small )
5758  pcrg1(k,i_ngacm) = pq(k,i_ngacm)*(1.0_rp-sw1) / (rhoq(k,i_ng)+sw1) * rhoq_crg(k,i_qg)
5759  end do
5760 
5761  ! rain-graupel
5762  do k = ks, ke
5763  sw1 = 0.5_rp - sign( 0.5_rp, rhoq(k,i_ng)-small )
5764  pcrg1(k,i_ngarm) = pq(k,i_ngarm)*(1.0_rp-sw1) / (rhoq(k,i_ng)+sw1) * rhoq_crg(k,i_qg)
5765  end do
5766 
5767  ! cloud-snow
5768  do k = ks, ke
5769  sw1 = 0.5_rp - sign( 0.5_rp, rhoq(k,i_ns)-small )
5770  pcrg1(k,i_nsacm) = pq(k,i_nsacm)*(1.0_rp-sw1) / (rhoq(k,i_ns)+sw1) * rhoq_crg(k,i_qs)
5771  end do
5772 
5773  ! rain-snow
5774  do k = ks, ke
5775  sw1 = 0.5_rp - sign( 0.5_rp, rhoq(k,i_ns)-small )
5776  pcrg1(k,i_nsarm) = pq(k,i_nsarm)*(1.0_rp-sw1) / (rhoq(k,i_ns)+sw1) * rhoq_crg(k,i_qs)
5777  end do
5778 
5779  ! cloud-ice
5780  do k = ks, ke
5781  sw1 = 0.5_rp - sign( 0.5_rp, rhoq(k,i_ni)-small )
5782  pcrg1(k,i_niacm) = pq(k,i_niacm)*(1.0_rp-sw1) / (rhoq(k,i_ni)+sw1) * rhoq_crg(k,i_qi)
5783  end do
5784 
5785  ! rain-ice
5786  do k = ks, ke
5787  sw1 = 0.5_rp - sign( 0.5_rp, rhoq(k,i_ni)-small )
5788  pcrg1(k,i_niarm) = pq(k,i_niarm)*(1.0_rp-sw1) / (rhoq(k,i_ni)+sw1) * rhoq_crg(k,i_qi)
5789  end do
5790 
5791  endif
5792 
5793  return
5794  end subroutine mixed_phase_collection_bin
5795 
5796  !----------------------------
5797  ! Auto-conversion, Accretion, Self-collection, Break-up
5798 !OCL SERIAL
5799  subroutine aut_acc_slc_brk( &
5800  KA, KS, KE, &
5801  flg_lt, &
5802  rhoq, rhoq_crg, &
5803  xq, dq_xave, &
5804  rho, &
5805  PQ, Pcrg )
5806  implicit none
5807 
5808  integer, intent(in) :: KA, KS, KE
5809  !
5810  real(RP), intent(in) :: rhoq(KA,I_QV:I_NG)
5811  real(RP), intent(in) :: rhoq_crg(KA,I_QC:I_QG)
5812  logical, intent(in) :: flg_lt
5813  real(RP), intent(in) :: xq(KA,HYDRO_MAX)
5814  real(RP), intent(in) :: dq_xave(KA,HYDRO_MAX)
5815  real(RP), intent(in) :: rho(KA)
5816  !
5817  real(RP), intent(inout) :: PQ(KA,PQ_MAX)
5818  real(RP), intent(inout) :: Pcrg(KA,PQ_MAX)
5819  !
5820  ! parameter for autoconversion
5821  real(RP), parameter :: kcc = 4.44e+9_rp ! collision efficiency [m3/kg2/sec]
5822  real(RP), parameter :: tau_min = 1.e-20_rp ! empirical filter by T.Mitsui
5823  real(RP), parameter :: rx_sep = 1.0_rp/x_sep ! 1/x_sep, 10/08/03 [Add] T.Mitsui
5824  !
5825  ! parameter for accretion
5826  real(RP), parameter :: kcr = 5.8_rp ! collision efficiency [m3/kg2/sec]
5827  real(RP), parameter :: thr_acc = 5.e-5_rp ! threshold for universal function original
5828  !
5829  ! parameter for self collection and collison break-up
5830  real(RP), parameter :: krr = 4.33_rp ! k_rr, S08 (35)
5831  real(RP), parameter :: kaprr = 60.7_rp ! kappa_rr, SB06(11)
5832  real(RP), parameter :: kbr = 1000._rp ! k_br, SB06(14)
5833  real(RP), parameter :: kapbr = 2.3e+3_rp ! kappa_br, SB06(15)
5834  real(RP), parameter :: dr_min = 0.35e-3_rp ! minimum diameter, SB06(13)-(15)
5835  !
5836  ! work variables
5837  real(RP) :: coef_nuc0 ! coefficient of number for Auto-conversion
5838  real(RP) :: coef_nuc1 ! mass
5839  real(RP) :: coef_aut0 ! number
5840  real(RP) :: coef_aut1 ! mass
5841  real(RP) :: lwc ! lc+lr
5842  real(RP) :: tau ! conversion ratio: qr/(qc+qr) ranges [0:1]
5843  real(RP) :: rho_fac ! factor of air density
5844  real(RP) :: psi_aut ! Universal function of Auto-conversion
5845  real(RP) :: psi_acc ! Universal function of Accretion
5846  real(RP) :: psi_brk ! Universal function of Breakup
5847  real(RP) :: ddr ! diameter difference from equilibrium
5848  !
5849  integer :: k, iqw
5850  real(RP) :: sw
5851  !
5852  coef_nuc0 = (nu(i_mp_qc)+2.0_rp)/(nu(i_mp_qc)+1.0_rp)
5853  coef_nuc1 = (nu(i_mp_qc)+2.0_rp)*(nu(i_mp_qc)+4.0_rp)/(nu(i_mp_qc)+1.0_rp)/(nu(i_mp_qc)+1.0_rp)
5854  coef_aut0 = -kcc*coef_nuc0
5855  coef_aut1 = -kcc/x_sep/20._rp*coef_nuc1
5856  !
5857 !OCL LOOP_FISSION_TARGET(LS)
5858  do k = ks, ke
5859  lwc = rhoq(k,i_qr) + rhoq(k,i_qc)
5860  if( lwc > xc_min )then
5861  tau = max(tau_min, rhoq(k,i_qr)/lwc)
5862  else
5863  tau = tau_min
5864  end if
5865  rho_fac = sqrt(rho_0/max(rho(k),rho_min))
5866  !
5867  ! Auto-conversion ( cloud-cloud => rain )
5868  psi_aut = 400._rp*(tau**0.7_rp)*(1.0_rp - (tau**0.7_rp))**3 ! (6) SB06
5869  pq(k,i_ncaut) = coef_aut0*rhoq(k,i_qc)*rhoq(k,i_qc)*rho_fac*rho_fac ! (9) SB06 sc+aut
5870  ! lc = lwc*(1-tau), lr = lwc*tau
5871  pq(k,i_lcaut) = coef_aut1*lwc*lwc*xq(k,i_mp_qc)*xq(k,i_mp_qc) & ! (4) SB06
5872  *((1.0_rp-tau)*(1.0_rp-tau) + psi_aut)*rho_fac*rho_fac !
5873  pq(k,i_nraut) = -rx_sep*pq(k,i_lcaut) ! (A7) SB01
5874  !--- for Charge density
5875  if (flg_lt) then
5876  sw = 0.5_rp - sign( 0.5_rp, rhoq(k,i_nc)-small )
5877  pcrg(k,i_ncaut) = pq(k,i_ncaut)*(1.0_rp-sw)/(rhoq(k,i_nc)+sw)*rhoq_crg(k,i_qc)
5878  pcrg(k,i_nraut) = -pcrg(k,i_ncaut)
5879  end if
5880  !
5881  ! Accretion ( cloud-rain => rain )
5882  psi_acc =(tau/(tau+thr_acc))**4 ! (8) SB06
5883  pq(k,i_lcacc) = -kcr*rhoq(k,i_qc)*rhoq(k,i_qr)*rho_fac*psi_acc ! (7) SB06
5884  pq(k,i_ncacc) = -kcr*rhoq(k,i_nc)*rhoq(k,i_qr)*rho_fac*psi_acc ! (A6) SB01
5885  !--- for Charge density
5886  if (flg_lt) then
5887  sw = 0.5_rp - sign( 0.5_rp, rhoq(k,i_nc)-small )
5888  pcrg(k,i_ncacc) = pq(k,i_ncacc)*(1.0_rp-sw)/(rhoq(k,i_nc)+sw)*rhoq(k,i_qc)
5889  end if
5890  !
5891  ! Self-collection ( rain-rain => rain )
5892  pq(k,i_nrslc) = -krr*rhoq(k,i_nr)*rhoq(k,i_qr)*rho_fac ! (A.8) SB01
5893  !
5894  ! Collisional breakup of rain
5895  ddr = min(1.e-3_rp, dq_xave(k,i_mp_qr) - dr_eq )
5896  if ( dq_xave(k,i_mp_qr) < dr_min ) then ! negligible
5897  psi_brk = -1.0_rp
5898  else if ( dq_xave(k,i_mp_qr) <= dr_eq ) then
5899  psi_brk = kbr*ddr ! (14) SB06
5900  else
5901  psi_brk = exp(kapbr*ddr) - 1.0_rp ! (15) SB06 (SB06 has a typo)
5902  end if
5903  pq(k,i_nrbrk) = - (psi_brk + 1.0_rp)*pq(k,i_nrslc) ! (13) SB06
5904  !
5905  end do
5906  !
5907  return
5908  end subroutine aut_acc_slc_brk
5909 
5910  ! Vapor Deposition, Ice Melting
5911 !OCL SERIAL
5912  subroutine dep_vapor_melt_ice( &
5913  KA, KS, KE, &
5914  rho, tem, pre, qd, & ! in
5915  rhoq, & ! in
5916  esw, esi, & ! in
5917  xq, vt_xave, dq_xave, & ! in
5918  PQ ) ! inout
5919  use scale_const, only: &
5920  eps => const_eps
5921  implicit none
5922 
5923  integer, intent(in) :: KA, KS, KE
5924 
5925  ! Diffusion growth or Evaporation, Sublimation
5926  real(RP), intent(inout) :: PQ(KA,PQ_MAX) ! mass change for cloud
5927 
5928  real(RP), intent(in) :: rho(KA) ! air density
5929  real(RP), intent(in) :: tem(KA) ! air temperature
5930  real(RP), intent(in) :: pre(KA) ! air pressure
5931  real(RP), intent(in) :: qd (KA) ! mixing ratio of dry air
5932  real(RP), intent(in) :: esw(KA) ! saturation vapor pressure(liquid water)
5933  real(RP), intent(in) :: esi(KA) ! saturation vapor pressure(solid water)
5934  real(RP), intent(in) :: rhoq(KA,I_QV:I_NG)
5935  real(RP), intent(in) :: xq(KA,HYDRO_MAX) ! mean mass
5936  ! Notice following values differ from mean terminal velocity or diameter.
5937  ! mean(vt(x)) /= vt(mean(x)) and mean(D(x)) /= D(mean(x))
5938  ! Following ones are vt(mean(x)) and D(mean(x)).
5939  real(RP), intent(in) :: vt_xave(KA,HYDRO_MAX,2) ! terminal velocity of mean cloud
5940  !
5941  real(RP), intent(in) :: dq_xave(KA,HYDRO_MAX) ! diameter
5942  !
5943  real(RP) :: rho_lim ! limited density
5944  real(RP) :: temc_lim ! limited temperature[celsius]
5945  real(RP) :: pre_lim ! limited density
5946  real(RP) :: temc ! temperature[celsius]
5947 ! real(RP) :: pv ! vapor pressure
5948  real(RP) :: qv ! mixing ratio of water vapor
5949 ! real(RP) :: ssw ! super saturation ratio(liquid water)
5950 ! real(RP) :: ssi ! super saturation ratio(ice water)
5951  real(RP) :: nua, r_nua ! kinematic viscosity of air
5952  real(RP) :: mua ! viscosity of air
5953  real(RP) :: Kalfa(KA) ! thermal conductance
5954  real(RP) :: Dw(KA) ! diffusivity of water vapor
5955  real(RP) :: Dt ! diffusivity of heat
5956  real(RP) :: Gw, Gi ! diffusion factor by balance between heat and vapor
5957  real(RP) :: Gwr, Gii, Gis, Gig ! for rain, ice, snow and graupel.
5958  real(RP) :: Gm ! melting factor by balance between heat and vapor
5959  real(RP) :: Nsc_r3 !
5960  ! [Mod] 11/08/30 T.Mitsui, considering large and small branches
5961 ! real(RP) :: Nrecs_r2
5962  real(RP) :: Nrers_r2, Nreis_r2 !
5963  real(RP) :: Nress_r2, Nregs_r2 !
5964 ! real(RP) :: Nrecl_r2
5965  real(RP) :: Nrerl_r2, Nreil_r2 !
5966  real(RP) :: Nresl_r2, Nregl_r2 !
5967  real(RP) :: NscNrer_s, NscNrer_l
5968  real(RP) :: NscNrei_s, NscNrei_l
5969  real(RP) :: NscNres_s, NscNres_l
5970  real(RP) :: NscNreg_s, NscNreg_l
5971  real(RP) :: ventLR_s, ventLR_l
5972  real(RP) :: ventNI_s, ventNI_l, ventLI_s, ventLI_l
5973  real(RP) :: ventNS_s, ventNS_l, ventLS_s, ventLS_l
5974  real(RP) :: ventNG_s, ventNG_l, ventLG_s, ventLG_l
5975  !
5976  real(RP) :: wtr, wti, wts, wtg
5977  real(RP), parameter :: r_14=1.0_rp/1.4_rp
5978  real(RP), parameter :: r_15=1.0_rp/1.5_rp
5979  !
5980  real(RP) :: ventLR
5981  real(RP) :: ventNI(KA), ventLI(KA)
5982  real(RP) :: ventNS(KA), ventLS(KA)
5983  real(RP) :: ventNG(KA), ventLG(KA)
5984  !
5985  real(RP), parameter :: Re_max=1.e+3_rp
5986  real(RP), parameter :: Re_min=1.e-4_rp
5987 
5988  real(RP) :: sw
5989  !
5990  integer :: k
5991  !
5992  ! Notice,T.Mitsui
5993  ! Vapor deposition and melting would not be solved iteratively to reach equilibrium.
5994  ! Because following phenomena are not adjustment but transition.
5995  ! Just time-scales differ among them.
5996  ! If we would treat more appropreately, there would be time-splitting method to solve each ones.
5997 
5998 !OCL LOOP_FISSION_TARGET(LS)
5999  do k = ks, ke
6000  temc = tem(k) - t00 ! degC
6001  temc_lim= max(temc, -40._rp ) ! [Add] 09/08/18 T.Mitsui, Pruppacher and Klett(1997),(13-3)
6002  rho_lim = max(rho(k),rho_min) ! [Add] 09/08/18 T.Mitsui
6003  qv = rhoq(k,i_qv)/rho_lim
6004  pre_lim = rho_lim*(qd(k)*rdry + qv*rvap)*(temc_lim+t00) ![Add] 09/08/18 T.Mitsui
6005  !--------------------------------------------------------------------
6006  ! Diffusion growth part is described in detail
6007  ! by Pruppacher and Klett (1997) Sec. 13.2(liquid) and 13.3(solid)
6008  !
6009  ! G:factor of thermal diffusion(1st.term) and vapor diffusion(2nd. term)
6010  ! SB06(23),(38), Lin et al(31),(52) or others
6011  ! Dw is introduced by Pruppacher and Klett(1997),(13-3)
6012  dw(k) = 0.211e-4_rp* (((temc_lim+t00)/t00)**1.94_rp) *(p00/pre_lim)
6013  kalfa(k) = ka0 + temc_lim*dka_dt
6014  mua = mua0 + temc_lim*dmua_dt
6015  nua = mua/rho_lim
6016  r_nua = 1.0_rp/nua
6017  gw = (lhv0/kalfa(k)/tem(k))*(lhv0/rvap/tem(k)-1.0_rp)+(rvap*tem(k)/dw(k)/esw(k))
6018  gi = (lhs0/kalfa(k)/tem(k))*(lhs0/rvap/tem(k)-1.0_rp)+(rvap*tem(k)/dw(k)/esi(k))
6019  ! capacities account for their surface geometries
6020  gwr = 4.0_rp*pi/cap(i_mp_qr)/gw
6021  gii = 4.0_rp*pi/cap(i_mp_qi)/gi
6022  gis = 4.0_rp*pi/cap(i_mp_qs)/gi
6023  gig = 4.0_rp*pi/cap(i_mp_qg)/gi
6024  ! vent: ventilation effect( asymmetry vapor field around particles due to aerodynamic )
6025  ! SB06 (30),(31) and each coefficient is by (88),(89)
6026  nsc_r3 = (nua/dw(k))**(0.33333333_rp) ! (Schmidt number )^(1/3)
6027  !
6028 ! Nrecs_r2 = sqrt(max(Re_min,min(Re_max,vt_xave(k,I_mp_QC,1)*dq_xave(k,I_mp_QC)*r_nua))) ! (Reynolds number)^(1/2) cloud
6029  nrers_r2 = sqrt(max(re_min,min(re_max,vt_xave(k,i_mp_qr,1)*dq_xave(k,i_mp_qr)*r_nua))) ! (Reynolds number)^(1/2) rain
6030  nreis_r2 = sqrt(max(re_min,min(re_max,vt_xave(k,i_mp_qi,1)*dq_xave(k,i_mp_qi)*r_nua))) ! (Reynolds number)^(1/2) cloud ice
6031  nress_r2 = sqrt(max(re_min,min(re_max,vt_xave(k,i_mp_qs,1)*dq_xave(k,i_mp_qs)*r_nua))) ! (Reynolds number)^(1/2) snow
6032  nregs_r2 = sqrt(max(re_min,min(re_max,vt_xave(k,i_mp_qg,1)*dq_xave(k,i_mp_qg)*r_nua))) ! (Reynolds number)^(1/2) graupel
6033  !
6034 ! Nrecl_r2 = sqrt(max(Re_min,min(Re_max,vt_xave(k,I_mp_QC,2)*dq_xave(k,I_mp_QC)*r_nua))) ! (Reynolds number)^(1/2) cloud
6035  nrerl_r2 = sqrt(max(re_min,min(re_max,vt_xave(k,i_mp_qr,2)*dq_xave(k,i_mp_qr)*r_nua))) ! (Reynolds number)^(1/2) rain
6036  nreil_r2 = sqrt(max(re_min,min(re_max,vt_xave(k,i_mp_qi,2)*dq_xave(k,i_mp_qi)*r_nua))) ! (Reynolds number)^(1/2) cloud ice
6037  nresl_r2 = sqrt(max(re_min,min(re_max,vt_xave(k,i_mp_qs,2)*dq_xave(k,i_mp_qs)*r_nua))) ! (Reynolds number)^(1/2) snow
6038  nregl_r2 = sqrt(max(re_min,min(re_max,vt_xave(k,i_mp_qg,2)*dq_xave(k,i_mp_qg)*r_nua))) ! (Reynolds number)^(1/2) graupel
6039  nscnrer_s=nsc_r3*nrers_r2 ! small rain
6040  nscnrer_l=nsc_r3*nrerl_r2 ! large rain
6041  !
6042  nscnrei_s=nsc_r3*nreis_r2 ! small ice
6043  nscnrei_l=nsc_r3*nreil_r2 ! large ice
6044  !
6045  nscnres_s=nsc_r3*nress_r2 ! small snow
6046  nscnres_l=nsc_r3*nresl_r2 ! large snow
6047  !
6048  nscnreg_s=nsc_r3*nregs_r2 ! small snow
6049  nscnreg_l=nsc_r3*nregl_r2 ! large snow
6050  !
6051  ventlr_s = ah_vent1(i_mp_qr,1) + bh_vent1(i_mp_qr,1)*nscnrer_s
6052  ventlr_l = ah_vent1(i_mp_qr,2) + bh_vent1(i_mp_qr,2)*nscnrer_l
6053  !
6054  ventni_s = ah_vent0(i_mp_qi,1) + bh_vent0(i_mp_qi,1)*nscnrei_s
6055  ventni_l = ah_vent0(i_mp_qi,2) + bh_vent0(i_mp_qi,2)*nscnrei_l
6056  ventli_s = ah_vent1(i_mp_qi,1) + bh_vent1(i_mp_qi,1)*nscnrei_s
6057  ventli_l = ah_vent1(i_mp_qi,2) + bh_vent1(i_mp_qi,2)*nscnrei_l
6058  !
6059  ventns_s = ah_vent0(i_mp_qs,1) + bh_vent0(i_mp_qs,1)*nscnres_s
6060  ventns_l = ah_vent0(i_mp_qs,2) + bh_vent0(i_mp_qs,2)*nscnres_l
6061  ventls_s = ah_vent1(i_mp_qs,1) + bh_vent1(i_mp_qs,1)*nscnres_s
6062  ventls_l = ah_vent1(i_mp_qs,2) + bh_vent1(i_mp_qs,2)*nscnres_l
6063  !
6064  ventng_s = ah_vent0(i_mp_qg,1) + bh_vent0(i_mp_qg,1)*nscnreg_s
6065  ventng_l = ah_vent0(i_mp_qg,2) + bh_vent0(i_mp_qg,2)*nscnreg_l
6066  ventlg_s = ah_vent1(i_mp_qg,1) + bh_vent1(i_mp_qg,1)*nscnreg_s
6067  ventlg_l = ah_vent1(i_mp_qg,2) + bh_vent1(i_mp_qg,2)*nscnreg_l
6068  !
6069  ! branch is 1.4 for rain, snow, graupel; is 1.0 for ice (PK97, 13-60,-61,-88,-89).
6070  !
6071  wtr = ( min(max( nscnrer_s*r_14, 0.5_rp), 2.0_rp) -0.5_rp )*r_15 ! weighting between 1.4*0.5 and 1.4*2
6072  wti = ( min(max( nscnrei_s , 0.5_rp), 2.0_rp) -0.5_rp )*r_15 ! weighting between 1.0*0.5 and 1.0*2
6073  wts = ( min(max( nscnres_s*r_14, 0.5_rp), 2.0_rp) -0.5_rp )*r_15 ! weighting between 1.4*0.5 and 1.4*2
6074  wtg = ( min(max( nscnreg_s*r_14, 0.5_rp), 2.0_rp) -0.5_rp )*r_15 ! weighting between 1.4*0.5 and 1.4*2
6075  ! interpolation between two branches
6076  ventni(k) = (1.0_rp-wti)*ventni_s + wti*ventni_l
6077  ventns(k) = (1.0_rp-wts)*ventns_s + wts*ventns_l
6078  ventng(k) = (1.0_rp-wtg)*ventng_s + wtg*ventng_l
6079  !
6080  ventlr = (1.0_rp-wtr)*ventlr_s + wtr*ventlr_l
6081  ventli(k) = (1.0_rp-wti)*ventli_s + wti*ventli_l
6082  ventls(k) = (1.0_rp-wts)*ventls_s + wts*ventls_l
6083  ventlg(k) = (1.0_rp-wtg)*ventlg_s + wtg*ventlg_l
6084  !
6085  ! SB06(29)
6086  ! [Mod] 08/05/08 T.Mitsui, recover PNXdep, and rain is only evaporation.
6087  ! Ni, Ns, Ng should decrease in nature so we add this term.
6088  ! And vapor deposition never occur unless number exist.
6089  ! [Add comment] 09/08/18
6090  ! recover condensation/evaporation of rain,
6091  ! and ventilation effects are not taken into account for cloud.
6092  !
6093 !!$***************************************************************************
6094 !!$ NOTICE:
6095 !!$ Hereafter PLxdep means inverse of timescale.
6096 !!$***************************************************************************
6097 !!$ PQ(k,I_LCdep) = Gwr*ssw*rhoq(k,I_NC)*dq_xave(k,I_mp_QC)*coef_deplc
6098 !!$ PQ(k,I_LRdep) = Gwr*ssw*rhoq(k,I_NR)*dq_xave(k,I_mp_QR)*ventLR
6099 !!$ PQ(k,I_LIdep) = Gii*ssi*rhoq(k,I_NI)*dq_xave(k,I_mp_QI)*ventLI(k)
6100 !!$ PQ(k,I_LSdep) = Gis*ssi*rhoq(k,I_NS)*dq_xave(k,I_mp_QS)*ventLS(k)
6101 !!$ PQ(k,I_LGdep) = Gig*ssi*rhoq(k,I_NG)*dq_xave(k,I_mp_QG)*ventLG(k)
6102  pq(k,i_lcdep) = gwr*rhoq(k,i_nc)*dq_xave(k,i_mp_qc)*coef_deplc
6103  pq(k,i_lrdep) = gwr*rhoq(k,i_nr)*dq_xave(k,i_mp_qr)*ventlr
6104  pq(k,i_lidep) = gii*rhoq(k,i_ni)*dq_xave(k,i_mp_qi)*ventli(k)
6105  pq(k,i_lsdep) = gis*rhoq(k,i_ns)*dq_xave(k,i_mp_qs)*ventls(k)
6106  pq(k,i_lgdep) = gig*rhoq(k,i_ng)*dq_xave(k,i_mp_qg)*ventlg(k)
6107  pq(k,i_nrdep) = pq(k,i_lrdep)/xq(k,i_mp_qr)
6108  pq(k,i_nidep) = 0.0_rp
6109  pq(k,i_nsdep) = pq(k,i_lsdep)/xq(k,i_mp_qs)
6110  pq(k,i_ngdep) = pq(k,i_lgdep)/xq(k,i_mp_qg)
6111  end do
6112 
6113  do k = ks, ke
6114  temc = tem(k) - t00 ! degC
6115  !------------------------------------------------------------------------
6116  ! Melting part is described by Pruppacher and Klett (1997) Sec.16.3.1
6117  ! Here we omit "Shedding" of snow-flakes and ice-particles.
6118  ! "Shedding" may be applicative if you refer
6119  ! eq.(38) in Cotton etal.(1986) Jour. Clim. Appl. Meteor. p.1658-1680.
6120  ! SB06(73)
6121  dt = kalfa(k)/(cpvap*rho_0)
6122  ! Gm: factor caused by balance between
6123  ! "water evaporation cooling(1st.)" and "fusion heating(2nd.)"
6124  ! SB06(76)
6125  ! [fix] 08/05/08 T.Mitsui LHF00 => EMELT and esw => PSAT0
6126  ! LHS0 is more suitable than LHS because melting occurs around 273.15 K.
6127  gm = 2.0_rp*pi/emelt&
6128  * ( (kalfa(k)*dt/dw(k))*(temc) + (dw(k)*lhs0/rvap)*(esi(k)/tem(k)-psat0/t00) )
6129  ! SB06(76)
6130  ! Notice! melting only occurs where T > 273.15 K else doesn't.
6131  ! [fix] 08/05/08 T.Mitsui, Gm could be both positive and negative value.
6132  ! See Pruppacher and Klett(1997) eq.(16-79) or Rasmussen and Pruppacher(1982)
6133  sw = ( sign(0.5_rp,temc) + 0.5_rp ) * ( sign(0.5_rp,gm-eps) + 0.5_rp ) ! sw = 1 if( (temc>=0.0_RP) .AND. (Gm>0.0_RP) ), otherwise sw = 0
6134  ! if Gm==0 then rh and tem is critical value for melting process.
6135  ! 08/05/16 [Mod] T.Mitsui, change term of PLimlt. N_i => L_i/ (limited x_i)
6136  ! because melting never occur when N_i=0.
6137  pq(k,i_limlt) = - gm * rhoq(k,i_qi)*dq_xave(k,i_mp_qi)*ventli(k)/xq(k,i_mp_qi) * sw
6138  pq(k,i_nimlt) = - gm * rhoq(k,i_ni)*dq_xave(k,i_mp_qi)*ventni(k)/xq(k,i_mp_qi) * sw
6139  pq(k,i_lsmlt) = - gm * rhoq(k,i_qs)*dq_xave(k,i_mp_qs)*ventls(k)/xq(k,i_mp_qs) * sw
6140  pq(k,i_nsmlt) = - gm * rhoq(k,i_ns)*dq_xave(k,i_mp_qs)*ventns(k)/xq(k,i_mp_qs) * sw
6141  pq(k,i_lgmlt) = - gm * rhoq(k,i_qg)*dq_xave(k,i_mp_qg)*ventlg(k)/xq(k,i_mp_qg) * sw
6142  pq(k,i_ngmlt) = - gm * rhoq(k,i_ng)*dq_xave(k,i_mp_qg)*ventng(k)/xq(k,i_mp_qg) * sw
6143  end do
6144 
6145  return
6146  end subroutine dep_vapor_melt_ice
6147  !-----------------------------------------------------------------------------
6148 
6149  ! Vapor Deposition [Add] 2022/03/23 T.Seiki for nucleation
6150 !OCL SERIAL
6151  subroutine dep_vapor_ice_wrk( &
6152  KA, KS, KE, &
6153  PLIdep_total, &
6154  rho, tem, pre, &
6155  qd, &
6156  esi, qsi, &
6157  rhoq, &
6158  vt_xave, dq_xave, &
6159  dt )
6160  use scale_const, only: &
6161  rvap => const_rvap, &
6162  rdry => const_rdry, &
6163  t00 => const_tem00, &
6164  lhs0 => const_lhs0, &
6165  lhf00 => const_lhf00, &
6166  pi => const_pi, &
6167  cpdry => const_cpdry, &
6168  pstd => const_pstd, &
6169  psat0 => const_psat0
6170  implicit none
6171 
6172  integer, intent(in) :: KA
6173  integer, intent(in) :: KS
6174  integer, intent(in) :: KE
6175  ! Diffusion growth or Evaporation, Sublimation
6176  real(RP), intent(out) :: PLIdep_total(KA) ! mass for cloud ice
6177  real(RP), intent(in) :: rho(KA) ! air density
6178  real(RP), intent(in) :: tem(KA) ! air temperature
6179  real(RP), intent(in) :: pre(KA) ! air pressure
6180  real(RP), intent(in) :: qd(KA) ! mixing ratio of dry air
6181  real(RP), intent(in) :: esi(KA) ! saturation vapor pressure(solid water)
6182  real(RP), intent(in) :: qsi(KA) ! saturation vapor pressure(solid water)
6183  real(RP), intent(in) :: rhoq(KA,I_QV:I_NG)
6184  ! Notice following values differ from mean terminal velocity or diameter.
6185  ! mean(vt(x)) /= vt(mean(x)) and mean(D(x)) /= D(mean(x))
6186  ! Following ones are vt(mean(x)) and D(mean(x)).
6187  real(RP), intent(in) :: vt_xave(KA,HYDRO_MAX,1:2) ! terminal velocity of mean cloud
6188  real(RP), intent(in) :: dq_xave(KA,HYDRO_MAX) !
6189  real(RP), intent(in) :: dt
6190  !
6191 ! real(RP), intent(in) :: dtime
6192 ! real(RP) :: dtime
6193  !
6194  real(RP) :: rho_lim ! limited density
6195  real(RP) :: temc_lim ! limited temperature[celsius]
6196  real(RP) :: pre_lim ! limited density
6197  real(RP) :: temc ! temperature[celsius]
6198  real(RP) :: pv ! vapor pressure
6199  real(RP) :: qv ! vapor pressure
6200  real(RP) :: ssi ! super saturation ratio(ice water)
6201  real(RP) :: nua, r_nua ! kinematic viscosity of air
6202  real(RP) :: mua ! viscosity of air
6203  real(RP) :: Kat ! thermal conductance
6204  real(RP) :: Dw ! diffusivity of water vapor
6205  real(RP) :: Dht ! diffusivity of heat
6206  real(RP) :: Gi ! diffusion factor by balance between heat and vapor
6207  real(RP) :: Gii, Gis, Gig ! for rain, ice, snow and graupel.
6208  real(RP) :: Gm ! melting factor by balance between heat and vapor
6209  real(RP) :: Nsc_r3 !
6210  !
6211  real(RP) :: Nreis_r2 !
6212  real(RP) :: Nress_r2, Nregs_r2 !
6213  real(RP) :: Nreil_r2 !
6214  real(RP) :: Nresl_r2, Nregl_r2 !
6215  real(RP) :: NscNrei_s, NscNrei_l
6216  real(RP) :: NscNres_s, NscNres_l
6217  real(RP) :: NscNreg_s, NscNreg_l
6218  real(RP) :: ventLI_s, ventLI_l
6219  real(RP) :: ventLS_s, ventLS_l
6220  real(RP) :: ventLG_s, ventLG_l
6221  real(RP) :: wti, wts, wtg
6222  real(RP), parameter :: r_14=1.0_rp/1.4_rp
6223  real(RP), parameter :: r_15=1.0_rp/1.5_rp
6224  real(RP) :: ventLI !
6225  real(RP) :: ventLS !
6226  real(RP) :: ventLG !
6227  !
6228  real(RP) :: total_dep
6229  real(RP) :: PLIdep_wrk
6230  real(RP) :: PLSdep_wrk
6231  real(RP) :: PLGdep_wrk
6232  real(RP) :: dep_limiter
6233  !
6234  real(RP), parameter :: Re_max=1.e3_rp
6235  real(RP), parameter :: Re_min=1.e-4_rp
6236  integer :: k
6237  !
6238 ! PLIdep_total(1:KS)=0.0_RP
6239 ! PLIdep_total(KE:KA)=0.0_RP
6240  plidep_total(:)=0.0_rp !! 22/10/14
6241 
6242  !
6243  do k=ks, ke
6244  temc = tem(k) - t00 ! degC
6245  temc_lim= max(temc, temc_lim_diff) !
6246  rho_lim = max(rho(k),rho_min) !
6247  qv = rhoq(k,i_qv)/rho_lim
6248  pre_lim = rho_lim*(qd(k)*rdry + qv*rvap)*(temc_lim+t00)
6249  !--------------------------------------------------------------------
6250  ! Diffusion growth part is described in detail
6251  ! by Pruppacher and Klett (1997) Sec. 13.2(liquid) and 13.3(solid)
6252  ! G:factor of thermal diffusion(1st.term) and vapor diffusion(2nd. term)
6253  ! SB06(23),(38), Lin et al(31),(52) or others
6254  ! Dw is introduced by Pruppacher and Klett(1997),(13-3)
6255  dw = 0.211e-4_rp* (((temc_lim+t00)/t00)**1.94_rp) *(pstd/pre_lim)
6256  kat = ka0 + temc_lim*dka_dt
6257  mua = mua0 + temc_lim*dmua_dt
6258  nua = mua/rho_lim
6259  r_nua = 1.0_rp/nua
6260  gi = (lhs0/kat/tem(k))*(lhs0/rvap/tem(k)-1.0_rp)+(rvap*tem(k)/dw/esi(k))
6261  ! capacities account for their surface geometries
6262  gii = 4.0_rp*pi/cap(i_mp_qi)/gi
6263  gis = 4.0_rp*pi/cap(i_mp_qs)/gi
6264  gig = 4.0_rp*pi/cap(i_mp_qg)/gi
6265  ! vent: ventilation effect( asymmetry vapor field around particles due to aerodynamic )
6266  ! SB06 (30),(31) and each coefficient is by (88),(89)
6267  nsc_r3 = (nua/dw)**(0.33333333_rp) ! (Schmidt number )^(1/3)
6268  ! Beard and Pruppacher(1971) had performed in the range [0<Re<=320],
6269  ! So here we limit Re in the range Re_max=1000, Re_min=0.0001.
6270  nreis_r2 = sqrt(max(re_min,min(re_max,vt_xave(k,i_mp_qi,1)*dq_xave(k,i_mp_qi)*r_nua))) ! (Reynolds number)^(1/2) cloud ice
6271  nress_r2 = sqrt(max(re_min,min(re_max,vt_xave(k,i_mp_qs,1)*dq_xave(k,i_mp_qs)*r_nua))) ! (Reynolds number)^(1/2) snow
6272  nregs_r2 = sqrt(max(re_min,min(re_max,vt_xave(k,i_mp_qg,1)*dq_xave(k,i_mp_qg)*r_nua))) ! (Reynolds number)^(1/2) graupel
6273  nreil_r2 = sqrt(max(re_min,min(re_max,vt_xave(k,i_mp_qi,2)*dq_xave(k,i_mp_qi)*r_nua))) ! (Reynolds number)^(1/2) cloud ice
6274  nresl_r2 = sqrt(max(re_min,min(re_max,vt_xave(k,i_mp_qs,2)*dq_xave(k,i_mp_qs)*r_nua))) ! (Reynolds number)^(1/2) snow
6275  nregl_r2 = sqrt(max(re_min,min(re_max,vt_xave(k,i_mp_qg,2)*dq_xave(k,i_mp_qg)*r_nua))) ! (Reynolds number)^(1/2) graupel
6276  !
6277  nscnrei_s=nsc_r3*nreis_r2 ! small ice
6278  nscnrei_l=nsc_r3*nreil_r2 ! large ice
6279  nscnres_s=nsc_r3*nress_r2 ! small snow
6280  nscnres_l=nsc_r3*nresl_r2 ! large snow
6281  nscnreg_s=nsc_r3*nregs_r2 ! small snow
6282  nscnreg_l=nsc_r3*nregl_r2 ! large snow
6283  !
6284  ventli_s = ah_vent1(i_mp_qi,1) + bh_vent1(i_mp_qi,1)*nscnrei_s
6285  ventli_l = ah_vent1(i_mp_qi,2) + bh_vent1(i_mp_qi,2)*nscnrei_l
6286  ventls_s = ah_vent1(i_mp_qs,1) + bh_vent1(i_mp_qs,1)*nscnres_s
6287  ventls_l = ah_vent1(i_mp_qs,2) + bh_vent1(i_mp_qs,2)*nscnres_l
6288  ventlg_s = ah_vent1(i_mp_qg,1) + bh_vent1(i_mp_qg,1)*nscnreg_s
6289  ventlg_l = ah_vent1(i_mp_qg,2) + bh_vent1(i_mp_qg,2)*nscnreg_l
6290  ! branch is 1.4 for rain, snow, graupel; is 1.0 for ice (PK97, 13-60,-61,-88,-89).
6291  wti = ( min(max( nscnrei_s , 0.5_rp), 2.0_rp) -0.5_rp )*r_15 ! weighting between 1.0*0.5 and 1.0*2
6292  wts = ( min(max( nscnres_s*r_14, 0.5_rp), 2.0_rp) -0.5_rp )*r_15 ! weighting between 1.4*0.5 and 1.4*2
6293  wtg = ( min(max( nscnreg_s*r_14, 0.5_rp), 2.0_rp) -0.5_rp )*r_15 ! weighting between 1.4*0.5 and 1.4*2
6294  ! interpolation between two branches
6295  ventli = (1.0_rp-wti)*ventli_s + wti*ventli_l
6296  ventls = (1.0_rp-wts)*ventls_s + wts*ventls_l
6297  ventlg = (1.0_rp-wtg)*ventlg_s + wtg*ventlg_l
6298  ! SB06(29)
6299  ssi = qv/qsi(k) - 1.0_rp ! supersaturation
6300  plidep_wrk = gii*ssi*max(rhoq(k,i_ni),0.0_rp)*dq_xave(k,i_mp_qi)*ventli
6301  plsdep_wrk = gis*ssi*max(rhoq(k,i_ns),0.0_rp)*dq_xave(k,i_mp_qs)*ventls
6302  plgdep_wrk = gig*ssi*max(rhoq(k,i_ng),0.0_rp)*dq_xave(k,i_mp_qg)*ventlg
6303  !
6304  dep_limiter = rho(k)*(qv-qsi(k))/dt
6305  if (ssi < -1.e-30_rp)then ! unsaturated
6306  plidep_total(k) = max(plidep_wrk+plsdep_wrk+plgdep_wrk, dep_limiter)
6307  else if (ssi > 1.e-30_rp)then ! saturated
6308  plidep_total(k) = min(plidep_wrk+plsdep_wrk+plgdep_wrk, dep_limiter)
6309  else
6310  plidep_total(k) = 0.0_rp
6311  end if
6312  enddo
6313 
6314  return
6315  end subroutine dep_vapor_ice_wrk
6316 
6317 
6318 !OCL SERIAL
6319  subroutine freezing_water( &
6320  KA, KS, KE, &
6321  dt, &
6322  rhoq, xq, tem, &
6323  PQ )
6324  implicit none
6325  !
6326  ! In this subroutine,
6327  ! We assumed surface temperature of droplets are same as environment.
6328 
6329  integer, intent(in) :: KA, KS, KE
6330 
6331  real(RP), intent(in) :: dt
6332  !
6333  real(RP), intent(in) :: tem(KA)
6334  !
6335  real(RP), intent(in) :: rhoq(KA,I_QV:I_NG)
6336  real(RP), intent(in) :: xq(KA,HYDRO_MAX)
6337  !
6338  real(RP), intent(inout):: PQ(KA,PQ_MAX)
6339  !
6340  real(RP), parameter :: temc_min = -65.0_rp
6341  real(RP), parameter :: a_het = 0.2_rp ! SB06 (44)
6342  real(RP), parameter :: b_het = 0.65_rp ! SB06 (44)
6343  !
6344  real(RP) :: coef_m2_c
6345  real(RP) :: coef_m2_r
6346  ! temperature [celsius]
6347  real(RP) :: temc, temc2, temc3, temc4
6348  ! temperature function of homegenous/heterogenous freezing
6349  real(RP) :: Jhom, Jhet, Jh(KA)
6350  real(RP) :: rdt
6351  real(RP) :: tmp
6352  !
6353  integer :: k
6354  !
6355  rdt = 1.0_rp/dt
6356  !
6357  coef_m2_c = coef_m2(i_mp_qc)
6358  coef_m2_r = coef_m2(i_mp_qr)
6359  !
6360 
6361  ! Note, xc should be limited in range[xc_min:xc_max].
6362  ! and PNChom need to be calculated by NC
6363  ! because reduction rate of Nc need to be bound by NC.
6364  ! For the same reason PLChom also bound by LC and xc.
6365  ! Basically L and N should be independent
6366  ! but average particle mass x should be in suitable range.
6367 
6368  ! Homogenous Freezing
6369  do k = ks, ke
6370  pq(k,i_lchom) = 0.0_rp
6371  pq(k,i_nchom) = 0.0_rp
6372  end do
6373 
6374  ! Heterogenous Freezing
6375  do k = ks, ke
6376  temc = max( tem(k) - t00, temc_min )
6377  ! These cause from aerosol-droplet interaction.
6378  ! Bigg(1953) formula, Khain etal.(2000) eq.(4.5), Pruppacher and Klett(1997) eq.(9-48)
6379  jhet = a_het*( exp( -b_het*temc ) - 1.0_rp )
6380  ! These cause in nature.
6381  ! Cotton and Field 2002, QJRMS. (12)
6382  if( temc < -30.0_rp ) then
6383  temc2 = temc*temc
6384  temc3 = temc*temc2
6385  temc4 = temc2*temc2
6386  jhom = 10.0_rp**(&
6387  - 243.40_rp - 14.75_rp*temc - 0.307_rp*temc2 &
6388  - 0.00287_rp*temc3 - 0.0000102_rp*temc4 ) *1.e+3_rp
6389  else if( temc < 0.0_rp) then
6390  jhom = 10._rp**(-7.63_rp-2.996_rp*(temc+30.0_rp))*1.e+3_rp
6391  else
6392  jhom = 0.0_rp
6393  jhet = 0.0_rp
6394  end if
6395  jh(k) = ( jhet + jhom ) * dt
6396  end do
6397 
6398  do k = ks, ke
6399 #if defined(NVIDIA) || defined(SX)
6400  tmp = min( xq(k,i_mp_qc)*jh(k), 1.e+3_rp) ! apply exp limiter
6401  pq(k,i_lchet) = -rdt*rhoq(k,i_qc)*( 1.0_rp - exp( -coef_m2_c*tmp ) )
6402  pq(k,i_nchet) = -rdt*rhoq(k,i_nc)*( 1.0_rp - exp( - tmp ) )
6403 
6404  tmp = min( xq(k,i_mp_qr)*jh(k), 1.e+3_rp) ! apply exp limiter
6405  pq(k,i_lrhet) = -rdt*rhoq(k,i_qr)*( 1.0_rp - exp( -coef_m2_r*tmp ) )
6406  pq(k,i_nrhet) = -rdt*rhoq(k,i_nr)*( 1.0_rp - exp( - tmp ) )
6407 #else
6408  pq(k,i_lchet) = -rdt*rhoq(k,i_qc)*( 1.0_rp - exp( -coef_m2_c*xq(k,i_mp_qc)*jh(k) ) )
6409  pq(k,i_nchet) = -rdt*rhoq(k,i_nc)*( 1.0_rp - exp( - xq(k,i_mp_qc)*jh(k) ) )
6410  pq(k,i_lrhet) = -rdt*rhoq(k,i_qr)*( 1.0_rp - exp( -coef_m2_r*xq(k,i_mp_qr)*jh(k) ) )
6411  pq(k,i_nrhet) = -rdt*rhoq(k,i_nr)*( 1.0_rp - exp( - xq(k,i_mp_qr)*jh(k) ) )
6412 #endif
6413  end do
6414 
6415  !
6416  return
6417  end subroutine freezing_water
6418 
6419  !----------------------------------------------------------------
6420 !OCL SERIAL
6421  subroutine update_by_phase_change( &
6422  KA, KS, KE, &
6423  ntmax, & ! in
6424  dt, & ! in
6425  cz, & ! in
6426  fz, & ! in
6427  w, & ! in
6428  dTdt_rad, & ! in
6429  rho, & ! in
6430  qdry, & ! in
6431  esw, esi, rhoq, & ! in
6432  pre, tem, & ! in
6433  cpa,cva, & ! in
6434  flg_lt, & ! in
6435  PQ, & ! inout
6436  sl_PLCdep, & ! inout
6437  sl_PLRdep, sl_PNRdep, & ! inout
6438  RHOQ_t, & ! out
6439  RHOE_t, & ! out
6440  CPtot_t, & ! out
6441  CVtot_t, & ! out
6442  qc_evaporate, & ! out
6443  rhoq_crg, & ! in:optional
6444  RHOQcrg_t ) ! out:optional
6445 
6446  use scale_atmos_hydrometeor, only: &
6447  cp_vapor, &
6448  cp_water, &
6449  cp_ice, &
6450  cv_vapor, &
6451  cv_water, &
6452  cv_ice
6453  use scale_atmos_saturation, only: &
6454  moist_pres2qsat_liq => atmos_saturation_pres2qsat_liq, &
6455  moist_pres2qsat_ice => atmos_saturation_pres2qsat_ice, &
6456  moist_dqs_dtem_dens_liq => atmos_saturation_dqs_dtem_dens_liq, &
6457  moist_dqs_dtem_dens_ice => atmos_saturation_dqs_dtem_dens_ice, &
6458  moist_dqs_dtem_dpre_liq => atmos_saturation_dqs_dtem_dpre_liq, &
6459  moist_dqs_dtem_dpre_ice => atmos_saturation_dqs_dtem_dpre_ice
6460  implicit none
6461 
6462  integer, intent(in) :: KA, KS, KE
6463 
6464  integer, intent(in) :: ntmax
6465  !
6466  real(RP), intent(in) :: dt ! time step[s]
6467  real(RP), intent(in) :: cz(KA) ! altitude [m]
6468  real(RP), intent(in) :: fz(0:KA) ! altitude difference [m]
6469  real(RP), intent(in) :: w (KA) ! vertical velocity @ full level [m/s]
6470  real(RP), intent(in) :: dTdt_rad(KA) ! temperture tendency by radiation[K/s]
6471  real(RP), intent(in) :: rho (KA) ! density[kg/m3]
6472  real(RP), intent(in) :: qdry(KA) ! dry air mass ratio [kg/kg]
6473  real(RP), intent(in) :: esw (KA) ! saturated vapor pressure for liquid
6474  real(RP), intent(in) :: esi (KA) ! for ice
6475  real(RP), intent(in) :: rhoq(KA,I_QV:I_NG)
6476 
6477  real(RP), intent(in) :: tem(KA) ! temperature[K]
6478  real(RP), intent(in) :: pre(KA) ! pressure[Pa]
6479  real(RP), intent(in) :: cpa(KA) !
6480  real(RP), intent(in) :: cva(KA) ! specific heat at constant volume
6481 
6482  !+++ tendency[kg/m3/s]
6483  real(RP), intent(inout) :: PQ(KA,PQ_MAX)
6484  !+++ Column integrated tendency[kg/m2/s]
6485  real(RP), intent(inout) :: sl_PLCdep
6486  real(RP), intent(inout) :: sl_PLRdep, sl_PNRdep
6487 
6488  real(RP),intent(out) :: RHOQ_t(KA,QA_MP)
6489  real(RP),intent(out) :: RHOE_t(KA)
6490  real(RP),intent(out) :: CPtot_t(KA)
6491  real(RP),intent(out) :: CVtot_t(KA)
6492 
6493  !+++ tendency[kg/m3/s]
6494  real(RP), intent(out) :: qc_evaporate(KA)
6495 
6496  !--- for lightning component
6497  logical, intent(in) :: flg_lt ! false -> without lightning, true-> with lightning
6498  real(RP), intent(in), optional :: rhoq_crg(KA,I_QC:I_QG)
6499  real(RP), intent(out), optional :: RHOQcrg_t(KA,I_QC:I_QG)
6500 
6501  real(RP) :: xi ! mean mass of ice particles
6502  real(RP) :: rrho ! 1/rho
6503  real(RP) :: wtem(KA) ! temperature[K]
6504  !
6505  real(RP) :: r_cva ! specific heat at constant volume
6506  !real(RP) :: cpa ! specific heat at constant pressure
6507  real(RP) :: r_cpa ! specific heat at constant pressure
6508  real(RP) :: qsw(KA) ! saturated mixing ratio for liquid
6509  real(RP) :: qsi(KA) ! saturated mixing ratio for solid
6510  real(RP) :: dqswdtem_rho(KA) ! (dqsw/dtem)_rho
6511  real(RP) :: dqsidtem_rho(KA) ! (dqsi/dtem)_rho
6512  real(RP) :: dqswdtem_pre(KA) ! (dqsw/dtem)_pre
6513  real(RP) :: dqsidtem_pre(KA) ! (dqsi/dtem)_pre
6514  real(RP) :: dqswdpre_tem(KA) ! (dqsw/dpre)_tem
6515  real(RP) :: dqsidpre_tem(KA) ! (dqsi/dpre)_tem
6516  !
6517  real(RP) :: w2(KA) ! vetical velocity[m/s]
6518  real(RP) :: Acnd ! Pdynliq + Bergeron-Findeisen
6519  real(RP) :: Adep ! Pdyndep + Bergeron-Findeisen
6520  real(RP) :: aliqliq, asolliq
6521  real(RP) :: aliqsol, asolsol
6522  real(RP) :: Pdynliq ! production term of ssw by vertical motion
6523  real(RP) :: Pdynsol ! production term of ssi by vertical motion
6524  real(RP) :: Pradliq ! production term of ssw by radiation
6525  real(RP) :: Pradsol ! production term of ssi by radiation
6526  real(RP) :: taucnd, r_taucnd ! time scale of ssw change by MP
6527  real(RP) :: taudep, r_taudep ! time scale of ssi change by MP
6528  real(RP) :: taucnd_c(KA), r_taucnd_c ! by cloud
6529  real(RP) :: taucnd_r(KA), r_taucnd_r ! by rain
6530  real(RP) :: taudep_i(KA), r_taudep_i ! by ice
6531  real(RP) :: taudep_s(KA), r_taudep_s ! by snow
6532  real(RP) :: taudep_g(KA), r_taudep_g ! by graupel
6533  ! alternative tendency through changing ssw and ssi
6534  real(RP) :: PNCdep
6535  real(RP) :: PLR2NR, PLI2NI, PLS2NS, PLG2NG
6536  real(RP) :: coef_a_cnd, coef_b_cnd
6537  real(RP) :: coef_a_dep, coef_b_dep
6538  !
6539  real(RP) :: frz_dqc
6540  real(RP) :: frz_dnc(KA)
6541  real(RP) :: frz_dqr
6542  real(RP) :: frz_dnr(KA)
6543  real(RP) :: mlt_dqi
6544  real(RP) :: mlt_dni(KA)
6545  real(RP) :: mlt_dqs
6546  real(RP) :: mlt_dns(KA)
6547  real(RP) :: mlt_dqg
6548  real(RP) :: mlt_dng(KA)
6549  real(RP) :: dep_qv
6550  real(RP) :: dep_dqi(KA)
6551  real(RP) :: dep_dni(KA)
6552  real(RP) :: dep_dqs(KA)
6553  real(RP) :: dep_dns(KA)
6554  real(RP) :: dep_dqg(KA)
6555  real(RP) :: dep_dng(KA)
6556  real(RP) :: dep_dqr(KA)
6557  real(RP) :: dep_dnr(KA)
6558  real(RP) :: dep_dqc(KA)
6559  real(RP) :: dep_dnc(KA) ! 11/08/30 [Add] T.Mitsui, dep_dnc
6560  real(RP) :: r_xc_ccn, r_xi_ccn ! 11/08/30 [Add] T.Mitsui
6561  !
6562  real(RP) :: drhoqv(KA)
6563  real(RP) :: drhoqc(KA), drhoqr(KA), drhoqi(KA), drhoqs(KA), drhoqg(KA)
6564  real(RP) :: drhonc(KA), drhonr(KA), drhoni(KA), drhons(KA), drhong(KA)
6565  !-- for Charge densicty
6566  real(RP) :: drhoqcrg_c(KA), drhoqcrg_r(KA)
6567  real(RP) :: drhoqcrg_i(KA), drhoqcrg_s(KA), drhoqcrg_g(KA)
6568  real(RP) :: frz_dnc_crg
6569  real(RP) :: frz_dnr_crg
6570  real(RP) :: mlt_dni_crg
6571  real(RP) :: mlt_dns_crg
6572  real(RP) :: mlt_dng_crg
6573  real(RP) :: dep_dni_crg
6574  real(RP) :: dep_dns_crg
6575  real(RP) :: dep_dng_crg
6576  real(RP) :: dep_dnr_crg
6577  real(RP) :: dep_dnc_crg
6578  !
6579  real(RP) :: fac1, fac2, fac3, fac4, fac5, fac6
6580  real(RP) :: r_rvaptem(KA) ! 1/(Rvap*tem)
6581  real(RP) :: pv ! vapor pressure
6582  real(RP) :: lvsw, lvsi ! saturated vapor density
6583  real(RP) :: dlvsw, dlvsi !
6584  ! [Add] 11/08/30 T.Mitsui
6585  real(RP) :: dcnd, ddep ! total cndensation/deposition
6586  real(RP) :: uplim_cnd ! upper limit of condensation
6587  real(RP) :: lowlim_cnd ! lower limit of evaporation
6588  ! [Add] 11/08/30 T.Mitsui
6589  real(RP) :: uplim_dep ! upper limit of condensation
6590  real(RP) :: lowlim_dep ! lower limit of evaporation
6591  real(RP) :: ssw, ssi ! supersaturation ratio
6592  real(RP) :: r_esw, r_esi ! 1/esw, 1/esi
6593  real(RP) :: r_lvsw, r_lvsi ! 1/(lvsw*ssw), 1/(lvsi*ssi)
6594  real(RP) :: r_dt ! 1/dt
6595  real(RP) :: ssw_o, ssi_o
6596 ! real(RP) :: dt_dyn
6597 ! real(RP) :: dt_mp
6598  !
6599 ! real(RP) :: tem_lh(KA,IA,JA)
6600 ! real(RP) :: dtemdt_lh(KA,IA,JA)
6601 
6602  real(RP) :: fac_cndc_wrk
6603  !
6604  real(RP), parameter :: tau100day = 1.e+7_rp
6605  real(RP), parameter :: r_tau100day = 1.e-7_rp
6606  real(RP), parameter :: eps=1.e-30_rp
6607  !
6608  real(RP) :: PLCdep(KA), PLRdep(KA), PNRdep(KA)
6609  real(RP) :: dz
6610  !
6611  integer :: k,iqw
6612  real(RP) :: sw, sw2
6613  real(RP) :: dqv, dql, dqi
6614  real(RP) :: dcv, dcp
6615  real(RP) :: dqc_crg, dqr_crg, dqi_crg, dqs_crg, dqg_crg
6616 
6617  !
6618  real(RP) :: fact
6619 
6620  !
6621 ! dt_dyn = dt*ntmax
6622  !
6623  r_dt = 1.0_rp/dt
6624  !
6625  r_xc_ccn=1.0_rp/xc_ccn
6626 ! r_xi_ccn=1.0_RP/xi_ccn
6627  !
6628  if( opt_fix_taucnd_c )then
6629  fac_cndc_wrk = fac_cndc**(1.0_rp-b_m(i_mp_qc))
6630  do k = ks, ke
6631  pq(k,i_lcdep) = pq(k,i_lcdep)*fac_cndc_wrk
6632  end do
6633  log_info("ATMOS_PHY_MP_SN14_update_by_phase_change",*) "taucnd:fac_cndc_wrk=",fac_cndc_wrk
6634  end if
6635 
6636 !OCL XFILL
6637  do k = ks, ke
6638  ! Temperature lower limit is only used for saturation condition.
6639  ! On the other hand original "tem" is used for calculation of latent heat or energy equation.
6640  wtem(k) = max( tem(k), tem_min )
6641  end do
6642 
6643  call moist_pres2qsat_liq( ka, ks, ke, &
6644  wtem(:), pre(:), qdry(:), & ! [IN]
6645  qsw(:) ) ! [OUT]
6646  call moist_pres2qsat_ice( ka, ks, ke, &
6647  wtem(:), pre(:), qdry(:), & ! [IN]
6648  qsi(:) ) ! [OUT]
6649  call moist_dqs_dtem_dens_liq( ka, ks, ke, &
6650  wtem(:), rho(:), & ! [IN]
6651  dqswdtem_rho(:) ) ! [OUT]
6652  call moist_dqs_dtem_dens_ice( ka, ks, ke, &
6653  wtem(:), rho(:), & ! [IN]
6654  dqsidtem_rho(:) ) ! [OUT]
6655  call moist_dqs_dtem_dpre_liq( ka, ks, ke, &
6656  wtem(:), pre(:), qdry(:), & ! [IN]
6657  dqswdtem_pre(:), dqswdpre_tem(:) ) ! [OUT]
6658  call moist_dqs_dtem_dpre_ice( ka, ks, ke, &
6659  wtem(:), pre(:), qdry(:), & ! [IN]
6660  dqsidtem_pre(:), dqsidpre_tem(:) ) ! [OUT]
6661 
6662  do k = ks, ke
6663  if( cz(k) <= 25000.0_rp )then
6664  w2(k) = w(k)
6665  else
6666  w2(k) = 0.0_rp
6667  end if
6668  if( pre(k) < esw(k)+1.e-10_rp )then
6669  qsw(k) = 1.0_rp
6670  dqswdtem_rho(k) = 0.0_rp
6671  dqswdtem_pre(k) = 0.0_rp
6672  dqswdpre_tem(k) = 0.0_rp
6673  end if
6674  if( pre(k) < esi(k)+1.e-10_rp )then
6675  qsi(k) = 1.0_rp
6676  dqsidtem_rho(k) = 0.0_rp
6677  dqsidtem_pre(k) = 0.0_rp
6678  dqsidpre_tem(k) = 0.0_rp
6679  end if
6680  end do
6681 
6682 !OCL LOOP_FISSION_TARGET(LS)
6683  do k = ks, ke
6684  r_rvaptem(k) = 1.0_rp/(rvap*wtem(k))
6685  lvsw = esw(k)*r_rvaptem(k) ! rho=p/(Rv*T)
6686  lvsi = esi(k)*r_rvaptem(k)
6687  pv = rhoq(k,i_qv)*rvap*tem(k)
6688  r_esw = 1.0_rp/esw(k)
6689  r_esi = 1.0_rp/esi(k)
6690  ssw = min( mp_ssw_lim, ( pv*r_esw-1.0_rp ) )
6691  ssi = pv*r_esi - 1.0_rp
6692  r_lvsw = 1.0_rp/lvsw
6693  r_lvsi = 1.0_rp/lvsi
6694  r_taucnd_c = pq(k,i_lcdep)*r_lvsw
6695  r_taucnd_r = pq(k,i_lrdep)*r_lvsw
6696  r_taudep_i = pq(k,i_lidep)*r_lvsi
6697  r_taudep_s = pq(k,i_lsdep)*r_lvsi
6698  r_taudep_g = pq(k,i_lgdep)*r_lvsi
6699 ! taucnd_c(k) = 1.0_RP/(r_taucnd_c+r_tau100day)
6700 ! taucnd_r(k) = 1.0_RP/(r_taucnd_r+r_tau100day)
6701 ! taudep_i(k) = 1.0_RP/(r_taudep_i+r_tau100day)
6702 ! taudep_s(k) = 1.0_RP/(r_taudep_s+r_tau100day)
6703 ! taudep_g(k) = 1.0_RP/(r_taudep_g+r_tau100day)
6704 
6705  r_cva = 1.0_rp / cva(k)
6706  r_cpa = 1.0_rp / cpa(k)
6707 
6708  ! Coefficient of latent heat release for ssw change by PLCdep and PLRdep
6709  aliqliq = 1.0_rp &
6710  + r_cva*( lhv00 + (cvvap-cl)*tem(k) )*dqswdtem_rho(k)
6711  ! Coefficient of latent heat release for ssw change by PLIdep, PLSdep and PLGdep
6712  asolliq = 1.0_rp &
6713  + r_cva*( lhv00 + lhf00 + (cvvap-ci)*tem(k) )*dqswdtem_rho(k)
6714  ! Coefficient of latent heat release for ssi change by PLCdep and PLRdep
6715  aliqsol = 1.0_rp &
6716  + r_cva*( lhv00 + (cvvap-cl)*tem(k) )*dqsidtem_rho(k)
6717  ! Coefficient of latent heat release for ssi change by PLIdep, PLSdep and PLGdep
6718  asolsol = 1.0_rp &
6719  + r_cva*( lhv00 + lhf00 + (cvvap-ci)*tem(k) )*dqsidtem_rho(k)
6720  pdynliq = w2(k) * grav * ( r_cpa*dqswdtem_pre(k) + rho(k)*dqswdpre_tem(k) )
6721  pdynsol = w2(k) * grav * ( r_cpa*dqsidtem_pre(k) + rho(k)*dqsidpre_tem(k) )
6722  pradliq = -dtdt_rad(k) * dqswdtem_rho(k)
6723  pradsol = -dtdt_rad(k) * dqsidtem_rho(k)
6724 
6725  ssw_o = ssw
6726  ssi_o = ssi
6727 ! ssw_o = ssw - Pdynliq*(dt_dyn-dt_mp)/qsw(k) + Pradliq*r_qsw*dt_mp
6728 ! ssi_o = ssi - Pdynsol*(dt_dyn-dt_mp)/qsi(k) + Pradsol*r_qsi*dt_mp
6729 
6730  r_taucnd = &
6731  + aliqliq*( r_taucnd_c+r_taucnd_r ) &
6732  + asolliq*( r_taudep_i+r_taudep_s+r_taudep_g )
6733  r_taudep = &
6734  + aliqsol*( r_taucnd_c+r_taucnd_r )&
6735  + asolsol*( r_taudep_i+r_taudep_s+r_taudep_g )
6736 
6737  if( r_taucnd < r_tau100day )then
6738  uplim_cnd = max( rho(k)*ssw_o*qsw(k)*r_dt, 0.0_rp )
6739  lowlim_cnd = min( rho(k)*ssw_o*qsw(k)*r_dt, 0.0_rp )
6740 ! taucnd = tau100day
6741  pq(k,i_lcdep) = max(lowlim_cnd, min(uplim_cnd, pq(k,i_lcdep)*ssw_o ))
6742  pq(k,i_lrdep) = max(lowlim_cnd, min(uplim_cnd, pq(k,i_lrdep)*ssw_o ))
6743  pq(k,i_nrdep) = min(0.0_rp, pq(k,i_nrdep)*ssw_o )
6744 ! PLR2NR = 0.0_RP
6745  else
6746  acnd = pdynliq + pradliq &
6747  - ( r_taudep_i+r_taudep_s+r_taudep_g ) * ( qsw(k) - qsi(k) )
6748  taucnd = 1.0_rp/r_taucnd
6749  ! Production term for liquid water content
6750  coef_a_cnd = rho(k)*acnd*taucnd
6751  coef_b_cnd = rho(k)*taucnd*r_dt*(ssw_o*qsw(k)-acnd*taucnd) * ( exp(-dt*r_taucnd) - 1.0_rp )
6752  pq(k,i_lcdep) = coef_a_cnd*r_taucnd_c - coef_b_cnd*r_taucnd_c
6753  plr2nr = pq(k,i_nrdep)/(pq(k,i_lrdep)+1.e-30_rp)
6754  pq(k,i_lrdep) = coef_a_cnd*r_taucnd_r - coef_b_cnd*r_taucnd_r
6755  pq(k,i_nrdep) = min(0.0_rp, pq(k,i_lrdep)*plr2nr )
6756  end if
6757 
6758  if( r_taudep < r_tau100day )then
6759  uplim_dep = max( rho(k)*ssi_o*qsi(k)*r_dt, 0.0_rp )
6760  lowlim_dep = min( rho(k)*ssi_o*qsi(k)*r_dt, 0.0_rp )
6761 ! taudep = tau100day
6762  pq(k,i_lidep) = max(lowlim_dep, min(uplim_dep, pq(k,i_lidep)*ssi_o ))
6763  pq(k,i_lsdep) = max(lowlim_dep, min(uplim_dep, pq(k,i_lsdep)*ssi_o ))
6764  pq(k,i_lgdep) = max(lowlim_dep, min(uplim_dep, pq(k,i_lgdep)*ssi_o ))
6765  pq(k,i_nidep) = min(0.0_rp, pq(k,i_nidep)*ssi_o )
6766  pq(k,i_nsdep) = min(0.0_rp, pq(k,i_nsdep)*ssi_o )
6767  pq(k,i_ngdep) = min(0.0_rp, pq(k,i_ngdep)*ssi_o )
6768  else
6769  adep = pdynsol + pradsol &
6770  + ( r_taucnd_c+r_taucnd_r ) * ( qsw(k) - qsi(k) )
6771  taudep = 1.0_rp/r_taudep
6772  ! Production term for ice water content
6773  coef_a_dep = rho(k)*adep*taudep
6774  coef_b_dep = rho(k)*taudep*r_dt*(ssi_o*qsi(k)-adep*taudep) * ( exp(-dt*r_taudep) - 1.0_rp )
6775  pli2ni = pq(k,i_nidep)/max(pq(k,i_lidep),1.e-30_rp)
6776  pls2ns = pq(k,i_nsdep)/max(pq(k,i_lsdep),1.e-30_rp)
6777  plg2ng = pq(k,i_ngdep)/max(pq(k,i_lgdep),1.e-30_rp)
6778  pq(k,i_lidep) = coef_a_dep*r_taudep_i - coef_b_dep*r_taudep_i
6779  pq(k,i_lsdep) = coef_a_dep*r_taudep_s - coef_b_dep*r_taudep_s
6780  pq(k,i_lgdep) = coef_a_dep*r_taudep_g - coef_b_dep*r_taudep_g
6781  pq(k,i_nidep) = min(0.0_rp, pq(k,i_lidep)*pli2ni )
6782  pq(k,i_nsdep) = min(0.0_rp, pq(k,i_lsdep)*pls2ns )
6783  pq(k,i_ngdep) = min(0.0_rp, pq(k,i_lgdep)*plg2ng )
6784  end if
6785 
6786  end do
6787 
6788  !--- evaporation/condensation
6789 !OCL LOOP_FISSION_TARGET(LS)
6790  do k = ks, ke
6791  sw = 0.5_rp - sign(0.5_rp, pq(k,i_lcdep)+eps) != 1 for PLCdep<=-eps
6792  pncdep = min(0.0_rp, ((rhoq(k,i_qc)+pq(k,i_lcdep)*dt)*r_xc_ccn - rhoq(k,i_nc))*r_dt ) * sw
6793 ! if( PQ(k,I_LCdep) < -eps )then
6794 ! PNCdep = min(0.0_RP, ((rhoq(k,I_QC)+PQ(k,I_LCdep)*dt)*r_xc_ccn - rhoq(k,I_NC))*r_dt )
6795 ! else
6796 ! PNCdep = 0.0_RP
6797 ! end if
6798 ! if( PQ(k,I_LIdep) < -eps )then
6799 ! PQ(k,I_NIdep) = min(0.0_RP, ((li(k)+PQ(k,I_LIdep)*dt)*r_xi_ccn - rhoq(k,I_NI))*r_dt )
6800 ! else
6801 ! PQ(k,I_NIdep) = 0.0_RP
6802 ! end if
6803 
6804  lvsw = esw(k)*r_rvaptem(k)
6805  dlvsw = rhoq(k,i_qv)-lvsw
6806  dcnd = dt*(pq(k,i_lcdep)+pq(k,i_lrdep))
6807 
6808  sw = ( sign(0.5_rp,dcnd) + sign(0.5_rp,dlvsw) ) &
6809  * ( 0.5_rp + sign(0.5_rp,abs(dcnd)-eps) ) ! to avoid zero division
6810  ! sw= 1: always supersaturated
6811  ! sw=-1: always unsaturated
6812  ! sw= 0: partially unsaturated during timestep
6813  fac1 = min(dlvsw*sw,dcnd*sw)*sw / (abs(sw)-1.0_rp+dcnd) & ! sw=1,-1
6814  + 1.0_rp - abs(sw) ! sw=0
6815  dep_dqc(k) = max( dt*pq(k,i_lcdep)*fac1, &
6816  -rhoq(k,i_qc) - 1e30_rp*(sw+1.0_rp) )*abs(sw) != -lc for sw=-1, -inf for sw=1
6817  dep_dqr(k) = max( dt*pq(k,i_lrdep)*fac1, &
6818  -rhoq(k,i_qr) - 1e30_rp*(sw+1.0_rp) )*abs(sw) != -lr for sw=-1, -inf for sw=1
6819 ! if ( (dcnd > eps) .AND. (dlvsw > eps) )then
6820 ! ! always supersaturated
6821 ! fac1 = min(dlvsw,dcnd)/dcnd
6822 ! dep_dqc(k) = dt*PQ(k,I_LCdep)*fac1
6823 ! dep_dqr(k) = dt*PQ(k,I_LRdep)*fac1
6824 ! else if( (dcnd < -eps) .AND. (dlvsw < -eps) )then
6825 ! ! always unsaturated
6826 ! fac1 = max( dlvsw,dcnd )/dcnd
6827 ! dep_dqc(k) = max( dt*PQ(k,I_LCdep)*fac1, -rhoq(k,I_QC) )
6828 ! dep_dqr(k) = max( dt*PQ(k,I_LRdep)*fac1, -rhoq(k,I_QR) )
6829 ! else
6830 ! ! partially unsaturated during timestep
6831 ! fac1 = 1.0_RP
6832 ! dep_dqc(k) = 0.0_RP
6833 ! dep_dqr(k) = 0.0_RP
6834 ! end if
6835 
6836  ! evaporation always lose number(always negative).
6837  dep_dnc(k) = max( dt*pncdep*fac1, -rhoq(k,i_nc) ) ! ss>0 dep=0, ss<0 dep<0 ! [Add] 11/08/30 T.Mitsui
6838  dep_dnr(k) = max( dt*pq(k,i_nrdep)*fac1, -rhoq(k,i_nr) ) ! ss>0 dep=0, ss<0 dep<0
6839 
6840  qc_evaporate(k) = - dep_dnc(k) ! [Add] Y.Sato 15/09/08
6841  end do
6842 
6843  !--- deposition/sublimation
6844 !OCL LOOP_FISSION_TARGET(LS)
6845  do k = ks, ke
6846  lvsi = esi(k)*r_rvaptem(k)
6847  ddep = dt*(pq(k,i_lidep)+pq(k,i_lsdep)+pq(k,i_lgdep))
6848  dlvsi = rhoq(k,i_qv)-lvsi ! limiter for esi>1.0_RP
6849 
6850  sw = ( sign(0.5_rp,ddep) + sign(0.5_rp,dlvsi) ) &
6851  * ( 0.5_rp + sign(0.5_rp,abs(ddep)-eps) ) ! to avoid zero division
6852  ! sw= 1: always supersaturated
6853  ! sw=-1: always unsaturated
6854  ! sw= 0: partially unsaturated during timestep
6855  fac2 = min(dlvsi*sw,ddep*sw)*sw / (abs(sw)-1.0_rp+ddep) & ! sw=1,-1
6856  + 1.0_rp - abs(sw) ! sw=0
6857  dep_dqi(k) = max( dt*pq(k,i_lidep) &
6858  * ( 1.0_rp-abs(sw) + fac2*abs(sw) ), & != fac2 for sw=-1,1, 1 for sw=0
6859  -rhoq(k,i_qi) - 1e30_rp*(sw+1.0_rp) ) != -li for sw=-1, -inf for sw=0,1
6860  dep_dqs(k) = max( dt*pq(k,i_lsdep) &
6861  * ( 1.0_rp-abs(sw) + fac2*abs(sw) ), & != fac2 for sw=-1,1, 1 for sw=0
6862  -rhoq(k,i_qs) - 1e30_rp*(sw+1.0_rp) ) != -ls for sw=-1, -inf for sw=0,1
6863  dep_dqg(k) = max( dt*pq(k,i_lgdep) &
6864  * ( 1.0_rp-abs(sw) + fac2*abs(sw) ), & != fac2 for sw=-1,1, 1 for sw=0
6865  -rhoq(k,i_qg) - 1e30_rp*(sw+1.0_rp) ) != -lg for sw=-1, -inf for sw=0,1
6866 ! if ( (ddep > eps) .AND. (dlvsi > eps) )then
6867 ! ! always supersaturated
6868 ! fac2 = min(dlvsi,ddep)/ddep
6869 ! dep_dqi(k) = dt*PQ(k,I_LIdep)*fac2
6870 ! dep_dqs(k) = dt*PQ(k,I_LSdep)*fac2
6871 ! dep_dqg(k) = dt*PQ(k,I_LGdep)*fac2
6872 ! else if ( (ddep < -eps) .AND. (dlvsi < -eps) )then
6873 ! ! always unsaturated
6874 ! fac2 = max(dlvsi,ddep)/ddep
6875 ! dep_dqi(k) = max(dt*PQ(k,I_LIdep)*fac2, -rhoq(k,I_QI) )
6876 ! dep_dqs(k) = max(dt*PQ(k,I_LSdep)*fac2, -rhoq(k,I_QS) )
6877 ! dep_dqg(k) = max(dt*PQ(k,I_LGdep)*fac2, -rhoq(k,I_QG) )
6878 ! else
6879 ! ! partially unsaturated during timestep
6880 ! fac2 = 1.0_RP
6881 ! dep_dqi(k) = dt*PQ(k,I_LIdep)
6882 ! dep_dqs(k) = dt*PQ(k,I_LSdep)
6883 ! dep_dqg(k) = dt*PQ(k,I_LGdep)
6884 ! end if
6885 
6886  ! evaporation always lose number(always negative).
6887  dep_dni(k) = max( dt*pq(k,i_nidep)*fac2, -rhoq(k,i_ni) ) ! ss>0 dep=0, ss<0 dep<0
6888  dep_dns(k) = max( dt*pq(k,i_nsdep)*fac2, -rhoq(k,i_ns) ) ! ss>0 dep=0, ss<0 dep<0
6889  dep_dng(k) = max( dt*pq(k,i_ngdep)*fac2, -rhoq(k,i_ng) ) ! ss>0 dep=0, ss<0 dep<0
6890  end do
6891 
6892  !--- freezing of cloud drop
6893 !OCL LOOP_FISSION_TARGET(LS)
6894  do k = ks, ke
6895  frz_dqc = max( dt*(pq(k,i_lchom)+pq(k,i_lchet)), -rhoq(k,i_qc)-dep_dqc(k) ) ! negative value
6896  frz_dnc(k) = max( dt*(pq(k,i_nchom)+pq(k,i_nchet)), -rhoq(k,i_nc)-dep_dnc(k) ) ! negative value
6897 
6898  drhoqc(k) = frz_dqc
6899  drhonc(k) = frz_dnc(k)
6900  drhoqi(k) = - frz_dqc
6901  drhoni(k) = - frz_dnc(k)
6902 
6903  fac3 = ( frz_dqc -eps )/( dt*(pq(k,i_lchom)+pq(k,i_lchet))-eps )
6904  fac4 = ( frz_dnc(k)-eps )/( dt*(pq(k,i_nchom)+pq(k,i_nchet))-eps )
6905  pq(k,i_lchom) = fac3*pq(k,i_lchom)
6906  pq(k,i_lchet) = fac3*pq(k,i_lchet)
6907  pq(k,i_nchom) = fac4*pq(k,i_nchom)
6908  pq(k,i_nchet) = fac4*pq(k,i_nchet)
6909  end do
6910 
6911  !--- melting
6912 !OCL LOOP_FISSION_TARGET(LS)
6913  do k = ks, ke
6914  ! ice change
6915  mlt_dqi = max( dt*pq(k,i_limlt), -rhoq(k,i_qi)-dep_dqi(k) ) ! negative value
6916  mlt_dni(k) = max( dt*pq(k,i_nimlt), -rhoq(k,i_ni)-dep_dni(k) ) ! negative value
6917 
6918  ! snow change
6919  mlt_dqs = max( dt*pq(k,i_lsmlt), -rhoq(k,i_qs)-dep_dqs(k) ) ! negative value
6920  mlt_dns(k) = max( dt*pq(k,i_nsmlt), -rhoq(k,i_ns)-dep_dns(k) ) ! negative value
6921 
6922  ! graupel change
6923  mlt_dqg = max( dt*pq(k,i_lgmlt), -rhoq(k,i_qg)-dep_dqg(k) ) ! negative value
6924  mlt_dng(k) = max( dt*pq(k,i_ngmlt), -rhoq(k,i_ng)-dep_dng(k) ) ! negative value
6925 
6926  xi = min(xi_max, max(xi_min, rhoq(k,i_qi)/(rhoq(k,i_ni)+ni_min) ))
6927  sw = 0.5_rp + sign(0.5_rp,xi-x_sep) ! if (xi>=x_sep) then sw=1 else sw=0
6928  ! sw=1: large ice crystals turn into rain by melting
6929 
6930  drhoqc(k) = drhoqc(k) - mlt_dqi * (1.0_rp-sw)
6931  drhonc(k) = drhonc(k) - mlt_dni(k) * (1.0_rp-sw)
6932 
6933  drhoqr(k) = - mlt_dqi * sw - mlt_dqs - mlt_dqg
6934  drhonr(k) = - mlt_dni(k) * sw - mlt_dns(k) - mlt_dng(k)
6935 
6936  drhoqi(k) = drhoqi(k) + mlt_dqi
6937  drhoni(k) = drhoni(k) + mlt_dni(k)
6938 
6939  drhoqs(k) = mlt_dqs
6940  drhons(k) = mlt_dns(k)
6941 
6942  drhoqg(k) = mlt_dqg
6943  drhong(k) = mlt_dng(k)
6944  end do
6945 
6946  !--- freezing of larger droplets
6947 !OCL LOOP_FISSION_TARGET(LS)
6948  do k = ks, ke
6949  frz_dqr = max( dt*(pq(k,i_lrhet)), min(0.0_rp, -rhoq(k,i_qr)-dep_dqr(k)) ) ! negative value
6950  frz_dnr(k) = max( dt*(pq(k,i_nrhet)), min(0.0_rp, -rhoq(k,i_nr)-dep_dnr(k)) ) ! negative value
6951 
6952  drhoqr(k) = drhoqr(k) + frz_dqr
6953  drhonr(k) = drhonr(k) + frz_dnr(k)
6954  drhoqg(k) = drhoqg(k) - frz_dqr
6955  drhong(k) = drhong(k) - frz_dnr(k)
6956 
6957  fac5 = ( frz_dqr -eps )/( dt*pq(k,i_lrhet)-eps )
6958  pq(k,i_lrhet) = fac5*pq(k,i_lrhet)
6959  fac6 = ( frz_dnr(k)-eps )/( dt*pq(k,i_nrhet)-eps )
6960  pq(k,i_nrhet) = fac6*pq(k,i_nrhet)
6961  end do
6962 
6963  ! water vapor change
6964 !OCL LOOP_FISSION_TARGET(LS)
6965  do k = ks, ke
6966  dep_qv = - ( dep_dqc(k) + dep_dqr(k) + dep_dqi(k) + dep_dqs(k) + dep_dqg(k) )
6967 
6968  ! limiter
6969  sw = 0.5_rp - sign(0.5_rp, abs(dep_qv) - eps) ! if |dep_qv| < eps then sw = 1
6970  fact = ( max( rhoq(k,i_qv) + dep_qv * dt, 0.0_rp ) - rhoq(k,i_qv) ) / dt / ( dep_qv + sw ) * ( 1.0_rp - sw ) &
6971  + 1.0_rp * sw
6972  fact = min( 1.0_rp, max( 0.0_rp, fact ) )
6973 
6974  dep_qv = dep_qv * fact
6975 
6976  dep_dqc(k) = dep_dqc(k) * fact
6977  dep_dnc(k) = dep_dnc(k) * fact
6978  dep_dqr(k) = dep_dqr(k) * fact
6979  dep_dnr(k) = dep_dnr(k) * fact
6980  dep_dqi(k) = dep_dqi(k) * fact
6981  dep_dni(k) = dep_dni(k) * fact
6982  dep_dqs(k) = dep_dqs(k) * fact
6983  dep_dns(k) = dep_dns(k) * fact
6984  dep_dqg(k) = dep_dqg(k) * fact
6985  dep_dng(k) = dep_dng(k) * fact
6986 
6987  drhoqv(k) = dep_qv
6988 
6989  drhoqc(k) = drhoqc(k) + dep_dqc(k)
6990  drhonc(k) = drhonc(k) + dep_dnc(k)
6991  drhoqr(k) = drhoqr(k) + dep_dqr(k)
6992  drhonr(k) = drhonr(k) + dep_dnr(k)
6993  drhoqi(k) = drhoqi(k) + dep_dqi(k)
6994  drhoni(k) = drhoni(k) + dep_dni(k)
6995  drhoqs(k) = drhoqs(k) + dep_dqs(k)
6996  drhons(k) = drhons(k) + dep_dns(k)
6997  drhoqg(k) = drhoqg(k) + dep_dqg(k)
6998  drhong(k) = drhong(k) + dep_dng(k)
6999 
7000  dz = fz(k) - fz(k-1)
7001  sl_plcdep = sl_plcdep + dep_dqc(k) * dz
7002  sl_plrdep = sl_plrdep + dep_dqr(k) * dz
7003  sl_pnrdep = sl_pnrdep + dep_dnr(k) * dz
7004  end do
7005 
7006  ! tendency
7007 !OCL LOOP_FISSION_TARGET(LS)
7008  do k = ks, ke
7009  rhoq_t(k,i_qv) = drhoqv(k) / dt
7010  rhoq_t(k,i_qc) = drhoqc(k) / dt
7011  rhoq_t(k,i_nc) = drhonc(k) / dt
7012  rhoq_t(k,i_qr) = drhoqr(k) / dt
7013  rhoq_t(k,i_nr) = drhonr(k) / dt
7014  rhoq_t(k,i_qi) = drhoqi(k) / dt
7015  rhoq_t(k,i_ni) = drhoni(k) / dt
7016  rhoq_t(k,i_qs) = drhoqs(k) / dt
7017  rhoq_t(k,i_ns) = drhons(k) / dt
7018  rhoq_t(k,i_qg) = drhoqg(k) / dt
7019  rhoq_t(k,i_ng) = drhong(k) / dt
7020 
7021  rhoe_t(k) = ( - lhv * drhoqv(k) + lhf * ( drhoqi(k) + drhoqs(k) + drhoqg(k) ) ) / dt
7022 
7023  rrho = 1.0_rp/rho(k)
7024  dqv = rrho * drhoqv(k)
7025  dql = rrho * ( drhoqc(k) + drhoqr(k) )
7026  dqi = rrho * ( drhoqi(k) + drhoqs(k) + drhoqg(k) )
7027 
7028  dcv = cv_vapor * dqv + cv_water * dql + cv_ice * dqi
7029  dcp = cp_vapor * dqv + cp_water * dql + cp_ice * dqi
7030 
7031  cvtot_t(k) = dcv/dt
7032  cptot_t(k) = dcp/dt
7033  end do
7034 
7035  !--- for Charge density
7036  if ( flg_lt ) then
7037 
7038  !--- reduce charge density of cloud and rain by evaporation
7039  do k = ks, ke
7040  sw = 0.5_rp - sign( 0.5_rp, rhoq(k,i_nc)-small ) !--- if NC is small, ignore charge transfer
7041  dep_dnc_crg = dep_dnc(k) * ( 1.0_rp-sw ) / ( rhoq(k,i_nc)+sw ) * rhoq_crg(k,i_qc)
7042  sw = 0.5_rp - sign( 0.5_rp, rhoq(k,i_nr)-small ) !--- if NR is small, ignore charge transfer
7043  dep_dnr_crg = dep_dnr(k) * ( 1.0_rp-sw ) / ( rhoq(k,i_nr)+sw ) * rhoq_crg(k,i_qr)
7044  !--- limiter
7045  sw = min( abs(rhoq_crg(k,i_qc)), abs(dep_dnc_crg) )
7046  dep_dnc_crg = sign( sw, dep_dnc_crg )
7047  sw = min( abs(rhoq_crg(k,i_qr)), abs(dep_dnr_crg) )
7048  dep_dnr_crg = sign( sw, dep_dnr_crg )
7049 
7050  drhoqcrg_c(k) = dep_dnc_crg
7051  drhoqcrg_r(k) = dep_dnr_crg
7052  end do
7053 
7054  do k = ks, ke
7055  sw = 0.5_rp - sign( 0.5_rp, rhoq(k,i_ni)-small ) !--- if NI is small, ignore charge transfer
7056  dep_dni_crg = dep_dni(k) * ( 1.0_rp-sw ) / ( rhoq(k,i_ni)+sw ) * rhoq_crg(k,i_qi)
7057  sw = 0.5_rp - sign( 0.5_rp, rhoq(k,i_ns)-small ) !--- if NS is small, ignore charge transfer
7058  dep_dns_crg = dep_dns(k) * ( 1.0_rp-sw ) / ( rhoq(k,i_ns)+sw ) * rhoq_crg(k,i_qs)
7059  sw = 0.5_rp - sign( 0.5_rp, rhoq(k,i_ng)-small ) !--- if NG is small, ignore charge transfer
7060  dep_dng_crg = dep_dng(k) * ( 1.0_rp-sw ) / ( rhoq(k,i_ng)+sw ) * rhoq_crg(k,i_qg)
7061  !--- limiter
7062  sw = min( abs(rhoq_crg(k,i_qi)), abs(dep_dni_crg) )
7063  dep_dni_crg = sign( sw, dep_dni_crg )
7064  sw = min( abs(rhoq_crg(k,i_qs)), abs(dep_dns_crg) )
7065  dep_dns_crg = sign( sw, dep_dns_crg )
7066  sw = min( abs(rhoq_crg(k,i_qg)), abs(dep_dng_crg) )
7067  dep_dng_crg = sign( sw, dep_dng_crg )
7068 
7069  drhoqcrg_i(k) = dep_dni_crg
7070  drhoqcrg_s(k) = dep_dns_crg
7071  drhoqcrg_g(k) = dep_dng_crg
7072  end do
7073 
7074  do k = ks, ke
7075  sw = 0.5_rp - sign( 0.5_rp, rhoq(k,i_nc)-small ) !--- if NC is small, ignore charge transfer
7076  frz_dnc_crg = frz_dnc(k) * ( 1.0_rp-sw ) / ( rhoq(k,i_nc)+sw ) * rhoq_crg(k,i_qc)
7077  !--- limiter
7078  sw = min( abs(rhoq_crg(k,i_qc) + drhoqcrg_c(k)), abs(frz_dnc_crg) )
7079  frz_dnc_crg = sign( sw, frz_dnc_crg )
7080 
7081  drhoqcrg_c(k) = drhoqcrg_c(k) + frz_dnc_crg
7082  drhoqcrg_i(k) = drhoqcrg_i(k) - frz_dnc_crg
7083  end do
7084 
7085  do k = ks, ke
7086  xi = min(xi_max, max(xi_min, rhoq(k,i_qi)/(rhoq(k,i_ni)+ni_min) ))
7087  sw = 0.5_rp + sign(0.5_rp,xi-x_sep) ! if (xi>=x_sep) then sw=1 else sw=0
7088  ! sw=1: large ice crystals turn into rain by melting
7089  sw2 = 0.5_rp - sign( 0.5_rp, rhoq(k,i_ni)-small ) !--- if NI is small, ignore charge transfer ! I -> C
7090  mlt_dni_crg = mlt_dni(k) * ( 1.0_rp-sw2 ) / ( rhoq(k,i_ni)+sw2 ) * rhoq_crg(k,i_qi)
7091  sw2 = 0.5_rp - sign( 0.5_rp, rhoq(k,i_ns)-small ) !--- if NS is small, ignore charge transfer ! S -> C
7092  mlt_dns_crg = mlt_dns(k) * ( 1.0_rp-sw2 ) / ( rhoq(k,i_ns)+sw2 ) * rhoq_crg(k,i_qs)
7093  sw2 = 0.5_rp - sign( 0.5_rp, rhoq(k,i_ng)-small ) !--- if NG is small, ignore charge transfer ! G -> C
7094  mlt_dng_crg = mlt_dng(k) * ( 1.0_rp-sw2 ) / ( rhoq(k,i_ng)+sw2 ) * rhoq_crg(k,i_qg)
7095  !--- limiter (|rhoq(NC)| is already reduced by deposition (dep_dni_crg and -frz_dnc_crg) )
7096  !-- Charge abs(frz_dnc_crg) is already moved from cloud to ice
7097  sw2 = min( abs(rhoq_crg(k,i_qi) + drhoqcrg_i(k)), abs(mlt_dni_crg) )
7098  mlt_dni_crg = sign( sw2, mlt_dni_crg )
7099  sw2 = min( abs(rhoq_crg(k,i_qs) + drhoqcrg_s(k)), abs(mlt_dns_crg) )
7100  mlt_dns_crg = sign( sw2, mlt_dns_crg )
7101  sw2 = min( abs(rhoq_crg(k,i_qg) + drhoqcrg_g(k)), abs(mlt_dng_crg) )
7102  mlt_dng_crg = sign( sw2, mlt_dng_crg )
7103 
7104  drhoqcrg_c(k) = drhoqcrg_c(k) - mlt_dni_crg * (1.0_rp-sw)
7105  drhoqcrg_r(k) = drhoqcrg_r(k) - mlt_dni_crg * sw - mlt_dns_crg - mlt_dng_crg
7106  drhoqcrg_i(k) = drhoqcrg_i(k) + mlt_dni_crg
7107  drhoqcrg_s(k) = drhoqcrg_s(k) + mlt_dns_crg
7108  drhoqcrg_g(k) = drhoqcrg_g(k) + mlt_dng_crg
7109  end do
7110 
7111  do k = ks, ke
7112  sw = 0.5_rp - sign( 0.5_rp, rhoq(k,i_nr)-small ) !--- if NR is small, ignore charge transfer
7113  frz_dnr_crg = frz_dnr(k) * ( 1.0_rp-sw ) / ( rhoq(k,i_nr)+sw ) * rhoq_crg(k,i_qr)
7114  !--- limiter
7115  sw = min( abs(rhoq_crg(k,i_qr) + drhoqcrg_r(k)), abs(frz_dnr_crg) )
7116  frz_dnr_crg = sign( sw, frz_dnr_crg )
7117 
7118  drhoqcrg_r(k) = drhoqcrg_r(k) + frz_dnr_crg
7119  drhoqcrg_g(k) = drhoqcrg_g(k) - frz_dnr_crg
7120  end do
7121 
7122  ! tendency of charge density
7123  do k = ks, ke
7124  rhoqcrg_t(k,i_qc) = drhoqcrg_c(k) / dt
7125  rhoqcrg_t(k,i_qr) = drhoqcrg_r(k) / dt
7126  rhoqcrg_t(k,i_qi) = drhoqcrg_i(k) / dt
7127  rhoqcrg_t(k,i_qs) = drhoqcrg_s(k) / dt
7128  rhoqcrg_t(k,i_qg) = drhoqcrg_g(k) / dt
7129  end do
7130 
7131  end if
7132 
7133  return
7134  end subroutine update_by_phase_change
7135  !-----------------------------------------------------------------------------
7137 !OCL SERIAL
7138  subroutine cross_section( &
7139  KA, KS, KE, &
7140  QA_MP, &
7141  QTRC0, &
7142  DENS0, &
7143  Crs )
7144  implicit none
7145 
7146  integer, intent(in) :: KA, KS, KE
7147  integer, intent(in) :: QA_MP
7148  real(RP), intent(in) :: QTRC0(KA,QA_MP) ! tracer mass concentration [kg/kg]
7149  real(RP), intent(in) :: DENS0(KA) ! density [kg/m3]
7150  real(RP), intent(out) :: Crs(KA,HYDRO_MAX)! Cross section [cm]
7151 
7152  ! mass concentration[kg/m3] and mean particle mass[kg]
7153  real(RP) :: xc(KA)
7154  real(RP) :: xr(KA)
7155  real(RP) :: xi(KA)
7156  real(RP) :: xs(KA)
7157  real(RP) :: xg(KA)
7158  ! radius of average mass
7159  real(RP) :: rc, rr
7160 
7161  real(RP) :: coef_Fuetal1998
7162  ! r2m_min is minimum value(moment of 1 particle with 1 micron)
7163  real(RP), parameter :: r2m_min=1.e-12_rp
7164  real(RP), parameter :: um2cm = 100.0_rp
7165 
7166  real(RP) :: limitsw, zerosw
7167  integer :: k
7168  !---------------------------------------------------------------------------
7169 
7170  ! mean particle mass[kg]
7171  do k = ks, ke
7172  xc(k) = min( xc_max, max( xc_min, dens0(k)*qtrc0(k,i_qc)/(qtrc0(k,i_nc)+nc_min) ) )
7173  xr(k) = min( xr_max, max( xr_min, dens0(k)*qtrc0(k,i_qr)/(qtrc0(k,i_nr)+nr_min) ) )
7174  xi(k) = min( xi_max, max( xi_min, dens0(k)*qtrc0(k,i_qi)/(qtrc0(k,i_ni)+ni_min) ) )
7175  xs(k) = min( xs_max, max( xs_min, dens0(k)*qtrc0(k,i_qs)/(qtrc0(k,i_ns)+ns_min) ) )
7176  xg(k) = min( xg_max, max( xg_min, dens0(k)*qtrc0(k,i_qg)/(qtrc0(k,i_ng)+ng_min) ) )
7177  enddo
7178 
7179 
7180  do k = ks, ke
7181  crs(k,i_mp_qc) = pi * coef_r2(i_mp_qc) * qtrc0(k,i_nc) * a_rea2(i_mp_qc) * xc(k)**b_rea2(i_mp_qc)
7182  enddo
7183 
7184  do k = ks, ke
7185  crs(k,i_mp_qr) = pi * coef_r2(i_mp_qr) * qtrc0(k,i_nr) * a_rea2(i_mp_qr) * xr(k)**b_rea2(i_mp_qr)
7186  enddo
7187 
7188  do k = ks, ke
7189  crs(k,i_mp_qi) = pi * coef_rea2(i_mp_qi) * qtrc0(k,i_ni) * a_rea2(i_mp_qi) * xi(k)**b_rea2(i_mp_qi)
7190  crs(k,i_mp_qs) = pi * coef_rea2(i_mp_qs) * qtrc0(k,i_ns) * a_rea2(i_mp_qs) * xs(k)**b_rea2(i_mp_qs)
7191  crs(k,i_mp_qg) = pi * coef_rea2(i_mp_qg) * qtrc0(k,i_ng) * a_rea2(i_mp_qg) * xg(k)**b_rea2(i_mp_qg)
7192  enddo
7193 
7194  return
7195  end subroutine cross_section
7196 
7197 !OCL SERIAL
7198  subroutine get_terminal_velocity( &
7199  KA, KS, KE, &
7200  vt_xa, xq, &
7201  rhoq, &
7202  log_rho_fac_q )
7203  implicit none
7204  integer, intent(in) :: KA, KS, KE
7205  real(RP), intent(out) :: vt_xa (KA,HYDRO_MAX,2) ! terminal velocity of average mass
7206  real(RP), intent(out) :: xq (KA,HYDRO_MAX) ! Mass of mean particle [kg] SB06(94)
7207  real(RP), intent(in) :: rhoq (KA,I_QV:I_NG)
7208  real(RP), intent(in) :: log_rho_fac_q(KA,HYDRO_MAX)
7209 
7210  real(RP) :: log_xq
7211  integer :: k
7212 
7213 !OCL LOOP_FISSION_TARGET(LS)
7214  do k = ks, ke
7215 
7216  xq(k,i_mp_qc) = min(xc_max, max(xc_min, rhoq(k,i_qc)/(rhoq(k,i_nc)+nc_min) ))
7217 
7218  log_xq = log(xq(k,i_mp_qc))
7219  vt_xa(k,i_mp_qc,1) = exp( log_alpha_v(i_mp_qc,1) + log_xq * beta_v(i_mp_qc,1) + log_rho_fac_q(k,i_mp_qc) )
7220  vt_xa(k,i_mp_qc,2) = exp( log_alpha_v(i_mp_qc,2) + log_xq * beta_v(i_mp_qc,2) + log_rho_fac_q(k,i_mp_qc) )
7221 
7222  xq(k,i_mp_qr) = min(xr_max, max(xr_min, rhoq(k,i_qr)/(rhoq(k,i_nr)+nr_min) ))
7223  log_xq = log(xq(k,i_mp_qr))
7224  vt_xa(k,i_mp_qr,1) = exp( log_alpha_v(i_mp_qr,1) + log_xq * beta_v(i_mp_qr,1) + log_rho_fac_q(k,i_mp_qr) )
7225  vt_xa(k,i_mp_qr,2) = vt_xa(k,i_mp_qr,1)
7226 
7227  xq(k,i_mp_qi) = min(xi_max, max(xi_min, rhoq(k,i_qi)/(rhoq(k,i_ni)+ni_min) ))
7228  log_xq = log(xq(k,i_mp_qi))
7229  vt_xa(k,i_mp_qi,1) = exp( log_alpha_v(i_mp_qi,1) + log_xq * beta_v(i_mp_qi,1) + log_rho_fac_q(k,i_mp_qi) )
7230  vt_xa(k,i_mp_qi,2) = exp( log_alpha_v(i_mp_qi,2) + log_xq * beta_v(i_mp_qi,2) + log_rho_fac_q(k,i_mp_qi) )
7231 
7232  xq(k,i_mp_qs) = min(xs_max, max(xs_min, rhoq(k,i_qs)/(rhoq(k,i_ns)+ns_min) ))
7233  log_xq = log(xq(k,i_mp_qs))
7234  vt_xa(k,i_mp_qs,1) = exp( log_alpha_v(i_mp_qs,1) + log_xq * beta_v(i_mp_qs,1) + log_rho_fac_q(k,i_mp_qs) )
7235  vt_xa(k,i_mp_qs,2) = exp( log_alpha_v(i_mp_qs,2) + log_xq * beta_v(i_mp_qs,2) + log_rho_fac_q(k,i_mp_qs) )
7236 
7237  xq(k,i_mp_qg) = min(xg_max, max(xg_min, rhoq(k,i_qg)/(rhoq(k,i_ng)+ng_min) ))
7238  log_xq = log(xq(k,i_mp_qg))
7239  vt_xa(k,i_mp_qg,1) = exp( log_alpha_v(i_mp_qg,1) + log_xq * beta_v(i_mp_qg,1) + log_rho_fac_q(k,i_mp_qg) )
7240  vt_xa(k,i_mp_qg,2) = exp( log_alpha_v(i_mp_qg,2) + log_xq * beta_v(i_mp_qg,2) + log_rho_fac_q(k,i_mp_qg) )
7241  end do
7242 
7243  return
7244  end subroutine get_terminal_velocity
7245 
7246 !OCL SERIAL
7247  subroutine get_diamiter( &
7248  KA, KS, KE, &
7249  dq_xa, &
7250  xq )
7251  implicit none
7252  integer, intent(in) :: KA, KS, KE
7253  real(RP), intent(out) :: dq_xa(KA,HYDRO_MAX)
7254  real(RP), intent(in) :: xq (KA,HYDRO_MAX)
7255  integer :: k
7256 
7257  ! diamter of average mass
7258  ! SB06(32)
7259 !OCL LOOP_FISSION_TARGET(LS)
7260  do k = ks, ke
7261  dq_xa(k,i_mp_qc) = a_m(i_mp_qc)*xq(k,i_mp_qc)**b_m(i_mp_qc)
7262  dq_xa(k,i_mp_qr) = a_m(i_mp_qr)*xq(k,i_mp_qr)**b_m(i_mp_qr)
7263  dq_xa(k,i_mp_qi) = a_m(i_mp_qi)*xq(k,i_mp_qi)**b_m(i_mp_qi)
7264  dq_xa(k,i_mp_qs) = a_m(i_mp_qs)*xq(k,i_mp_qs)**b_m(i_mp_qs)
7265  dq_xa(k,i_mp_qg) = a_m(i_mp_qg)*xq(k,i_mp_qg)**b_m(i_mp_qg)
7266  end do
7267 
7268  return
7269  end subroutine get_diamiter
7270 
7271 end module scale_atmos_phy_mp_sn14
module atmosphere / hydrometeor
integer, parameter, public n_hyd
real(rp), public cp_ice
CP for ice [J/kg/K].
integer, parameter, public i_hc
liquid water cloud
integer, parameter, public i_hs
snow
real(rp), public cv_vapor
CV for vapor [J/kg/K].
real(rp), public cp_vapor
CP for vapor [J/kg/K].
integer, parameter, public i_hg
graupel
real(rp), public cp_water
CP for water [J/kg/K].
real(rp), public cv_ice
CV for ice [J/kg/K].
integer, parameter, public i_hh
hail
integer, parameter, public i_hi
ice water cloud
real(rp), public cv_water
CV for water [J/kg/K].
integer, parameter, public i_hr
liquid water rain
module ATMOSPHERE / Physics Cloud Microphysics
integer, parameter, public atmos_phy_mp_sn14_nwaters
subroutine ice_multiplication(KA, KS, KE, flg_lt, Pac, tem, rhoq, rhoq_crg, xq, PQ, Pcrg1)
subroutine, public atmos_phy_mp_sn14_terminal_velocity(KA, KS, KE, DENS, TEMP, RHOQ, PRES, vterm)
ATMOS_PHY_MP_sn14_terminal_velocity Calculate terminal velocity.
subroutine aut_acc_slc_brk(KA, KS, KE, flg_lt, rhoq, rhoq_crg, xq, dq_xave, rho, PQ, Pcrg)
character(len=h_mid), dimension(qa_mp), parameter, public atmos_phy_mp_sn14_tracer_descriptions
integer, parameter, public qa_mp
integer, parameter, public atmos_phy_mp_sn14_ntracers
subroutine, public atmos_phy_mp_sn14_cloud_fraction(KA, KS, KE, IA, IS, IE, JA, JS, JE, QTRC, mask_criterion, cldfrac)
ATMOS_PHY_MP_sn14_cloud_fraction Calculate Cloud Fraction.
subroutine, public atmos_phy_mp_sn14_effective_radius(KA, KS, KE, IA, IS, IE, JA, JS, JE, DENS0, TEMP0, QTRC0, Re)
ATMOS_PHY_MP_sn14_effective_radius Calculate Effective Radius.
subroutine, public atmos_phy_mp_sn14_tendency(KA, KS, KE, IA, IS, IE, JA, JS, JE, DENS, W, QTRC, PRES, TEMP, Qdry, CPtot, CVtot, CCN, dt, cz, fz, RHOQ_t, RHOE_t, CPtot_t, CVtot_t, EVAPORATE, flg_lt, d0_crg, v0_crg, dqcrg, beta_crg, QTRC_crg, QSPLT_in, Sarea, RHOQcrg_t)
ATMOS_PHY_MP_sn14_tendency calculate tendency.
subroutine dep_vapor_ice_wrk(KA, KS, KE, PLIdep_total, rho, tem, pre, qd, esi, qsi, rhoq, vt_xave, dq_xave, dt)
subroutine, public atmos_phy_mp_sn14_qtrc2nhyd(KA, KS, KE, IA, IS, IE, JA, JS, JE, QTRC0, Ne)
Calculate number concentration of each category.
subroutine nucleation_ice_hom(KA, KS, KE, tem, pre, rho, qd, rhoq_qv, cva, cpa, w, dTdt_rad, dTdt_dep, PLIdep, dt, PLIhom, PNIhom)
subroutine, public atmos_phy_mp_sn14_finalize
finalize
character(len=h_short), dimension(qa_mp), parameter, public atmos_phy_mp_sn14_tracer_units
subroutine, public atmos_phy_mp_sn14_setup(KA, IA, JA)
ATMOS_PHY_MP_sn14_setup setup.
integer, parameter, public atmos_phy_mp_sn14_nices
character(len=h_short), dimension(qa_mp), parameter, public atmos_phy_mp_sn14_tracer_names
subroutine mixed_phase_collection_bin(KA, KS, KE, flg_lt, d0_crg, v0_crg, beta_crg, dqcrg, wtem, rhoq, rhoq_crg, xq, dq_xave, vt_xave, rho, PQ, Pcrg1, Pcrg2, Pac)
subroutine nucleation(KA, KS, KE, cz, fz, w, rho, tem, pre, qdry, rhoq, cpa, cva, dTdt_rad, qke, CCN, nc_uplim_d, dt, dq_xa, vt_xa, PQ)
subroutine freezing_water(KA, KS, KE, dt, rhoq, xq, tem, PQ)
subroutine debug_tem(KA, KS, KE, point, i, j, tem, rho, pre, qv)
subroutine mixed_phase_collection(KA, KS, KE, flg_lt, d0_crg, v0_crg, beta_crg, dqcrg, wtem, rhoq, rhoq_crg, xq, dq_xave, vt_xave, PQ, Pcrg1, Pcrg2, Pac)
subroutine, public atmos_phy_mp_sn14_qhyd2qtrc(KA, KS, KE, IA, IS, IE, JA, JS, JE, Qe, QTRC, QNUM)
subroutine, public atmos_phy_mp_sn14_qtrc2qhyd(KA, KS, KE, IA, IS, IE, JA, JS, JE, QTRC0, Qe)
ATMOS_PHY_MP_sn14_qtrc2qhyd Calculate mass ratio of each category.
subroutine cross_section(KA, KS, KE, QA_MP, QTRC0, DENS0, Crs)
Calculate Cross Section.
module atmosphere / saturation
module CONSTANT
Definition: scale_const.F90:11
real(rp), public const_eps
small number
Definition: scale_const.F90:35
real(rp), parameter, public const_dwatr
density of water [kg/m3]
Definition: scale_const.F90:89
real(rp), parameter, public const_pi
pi
Definition: scale_const.F90:32
real(rp), parameter, public const_tem00
temperature reference (0C) [K]
Definition: scale_const.F90:99
real(dp), parameter, public const_undef8
undefined value (REAL8)
Definition: scale_const.F90:42
real(rp), public const_pre00
pressure reference [Pa]
Definition: scale_const.F90:97
real(rp), public const_pstd
standard pressure [Pa]
Definition: scale_const.F90:96
real(rp), parameter, public const_rvap
specific gas constant (water vapor) [J/kg/K]
Definition: scale_const.F90:68
real(rp), public const_lhf00
latent heat of fusion at 0K [J/kg]
Definition: scale_const.F90:87
real(rp), public const_lhv00
latent heat of vaporizaion at 0K [J/kg]
Definition: scale_const.F90:83
real(rp), public const_lhf0
latent heat of fusion at 0C [J/kg]
Definition: scale_const.F90:86
real(rp), public const_undef
Definition: scale_const.F90:43
real(rp), public const_lhs00
latent heat of sublimation at 0K [J/kg]
Definition: scale_const.F90:85
real(rp), parameter, public const_lhs0
latent heat of sublimation at 0C [J/kg]
Definition: scale_const.F90:84
real(rp), parameter, public const_cl
specific heat (liquid water) [J/kg/K]
Definition: scale_const.F90:71
real(rp), parameter, public const_emelt
Definition: scale_const.F90:79
real(rp), parameter, public const_ci
specific heat (ice) [J/kg/K]
Definition: scale_const.F90:72
real(rp), public const_cvdry
specific heat (dry air,constant volume) [J/kg/K]
Definition: scale_const.F90:61
real(rp), public const_grav
standard acceleration of gravity [m/s2]
Definition: scale_const.F90:49
real(rp), public const_cvvap
specific heat (water vapor, constant volume) [J/kg/K]
Definition: scale_const.F90:70
real(rp), parameter, public const_psat0
saturate pressure of water vapor at 0C [Pa]
Definition: scale_const.F90:88
real(rp), public const_epsvap
Rdry / Rvap.
Definition: scale_const.F90:75
real(rp), public const_rdry
specific gas constant (dry air) [J/kg/K]
Definition: scale_const.F90:59
real(rp), parameter, public const_lhv0
latent heat of vaporizaion at 0C [J/kg]
Definition: scale_const.F90:82
real(rp), public const_cpdry
specific heat (dry air,constant pressure) [J/kg/K]
Definition: scale_const.F90:60
real(rp), parameter, public const_cpvap
specific heat (water vapor, constant pressure) [J/kg/K]
Definition: scale_const.F90:69
module file_history
subroutine, public file_history_reg(name, desc, unit, itemid, standard_name, ndims, dim_type, cell_measures, fill_halo)
Register/Append variable to history file.
module STDIO
Definition: scale_io.F90:10
integer, public io_fid_conf
Config file ID.
Definition: scale_io.F90:57
module PROCESS
Definition: scale_prc.F90:11
subroutine, public prc_abort
Abort Process.
Definition: scale_prc.F90:350
integer, public prc_myrank
process num in local communicator
Definition: scale_prc.F90:91
module PRECISION
integer, parameter, public dp
integer, parameter, public rp
module profiler
Definition: scale_prof.F90:11
module SPECFUNC
real(rp) function, public sf_gamma(x)
Gamma function.