SCALE-RM
mod_atmos_phy_mp_driver.F90
Go to the documentation of this file.
1 !-------------------------------------------------------------------------------
10 !-------------------------------------------------------------------------------
11 #include "scalelib.h"
13  !-----------------------------------------------------------------------------
14  !
15  !++ used modules
16  !
17  use scale_precision
18  use scale_io
19  use scale_prof
21  use scale_tracer
22  !-----------------------------------------------------------------------------
23  implicit none
24  private
25  !-----------------------------------------------------------------------------
26  !
27  !++ Public procedure
28  !
34 
35  interface abstract
36  subroutine qhyd2qtrc( &
37  KA, KS, KE, IA, IS, IE, JA, JS, JE, &
38  QV, QHYD, &
39  QTRC, &
40  QNUM )
41  use scale_precision
43  use mod_atmos_phy_mp_vars, only: qa_mp
44  integer, intent(in) :: ka, ks, ke
45  integer, intent(in) :: ia, is, ie
46  integer, intent(in) :: ja, js, je
47  real(RP), intent(in) :: qv(ka,ia,ja)
48  real(RP), intent(in) :: qhyd(ka,ia,ja,n_hyd)
49  real(RP), intent(out) :: qtrc(ka,ia,ja,qa_mp)
50  real(RP), intent(in), optional :: qnum(ka,ia,ja,n_hyd)
51  end subroutine qhyd2qtrc
52  end interface abstract
53  procedure(qhyd2qtrc), pointer :: atmos_phy_mp_user_qhyd2qtrc => null()
55 
56  !-----------------------------------------------------------------------------
57  !
58  !++ Public parameters & variables
59  !
60  !-----------------------------------------------------------------------------
61  !
62  !++ Private procedure
63  !
64  !-----------------------------------------------------------------------------
65  !
66  !++ Private parameters & variables
67  !
68  logical, private :: mp_do_precipitation = .true.
69  logical, private :: mp_do_negative_fixer = .true.
70  real(RP), private :: mp_limit_negative = 0.1_rp
71  integer, private :: mp_ntmax_sedimentation = 1
72  real(RP), private :: mp_max_term_vel = 10.0_rp
73  real(RP), private :: mp_cldfrac_thleshold
74  integer, private :: mp_nstep_sedimentation
75  real(RP), private :: mp_rnstep_sedimentation
76  real(DP), private :: mp_dtsec_sedimentation
77 
78  integer, private, allocatable :: hist_vterm_id(:)
79  integer, private :: hist_nf_rhoh_id
80  integer, private :: hist_nf_dens_id
81  integer, private :: hist_nf_engi_id
82  integer, private :: monit_nf_mass_id
83  integer, private :: monit_nf_engi_id
84  !-----------------------------------------------------------------------------
85 contains
86  !-----------------------------------------------------------------------------
89  use scale_prc, only: &
90  prc_abort
91  use scale_tracer, only: &
93  use scale_atmos_hydrometeor, only: &
95  use scale_atmos_phy_mp_kessler, only: &
102  use scale_atmos_phy_mp_tomita08, only: &
109  use scale_atmos_phy_mp_sn14, only: &
116  use scale_atmos_phy_mp_suzuki10, only: &
125  use mod_atmos_admin, only: &
128  use mod_atmos_phy_mp_vars, only: &
129  qa_mp, &
130  qs_mp, &
131  qe_mp
132  implicit none
133 
134  integer :: QS2
135  !---------------------------------------------------------------------------
136 
137  log_newline
138  log_info("ATMOS_PHY_MP_driver_tracer_setup",*) 'Setup'
139 
140  if ( atmos_sw_phy_mp ) then
141  select case ( atmos_phy_mp_type )
142  case ( 'KESSLER' )
149  qs_mp ) ! [OUT]
151  case ( 'TOMITA08' )
158  qs_mp ) ! [OUT]
160  case( 'SN14' )
162  atmos_phy_mp_sn14_nwaters, & ! [IN]
163  atmos_phy_mp_sn14_nices, & ! [IN]
164  atmos_phy_mp_sn14_tracer_names(1:6), & ! [IN]
166  atmos_phy_mp_sn14_tracer_units(1:6), & ! [IN]
167  qs_mp ) ! [OUT]
168  call tracer_regist( qs2, & ! [OUT]
169  5, & ! [IN]
170  atmos_phy_mp_sn14_tracer_names(7:11), & ! [IN]
172  atmos_phy_mp_sn14_tracer_units(7:11) ) ! [IN]
174  case ( 'SUZUKI10' )
182  qs_mp ) ! [OUT]
183  if( atmos_phy_mp_suzuki10_nccn > 0 ) then
184  call tracer_regist( qs2, & ! [OUT]
188  + 2 : ), & ! [IN]
191  + 2 : ), & ! [IN]
194  + 2 : ) ) ! [IN]
195  end if
197  case default
198  log_error("ATMOS_PHY_MP_driver_tracer_setup",*) 'ATMOS_PHY_MP_TYPE is invalud: ', trim(atmos_phy_mp_type)
199  call prc_abort
200  end select
201 
202  qe_mp = qs_mp + qa_mp - 1
203 
204  else
205  qa_mp = 0
206  qs_mp = -1
207  qe_mp = -2
208  end if
209 
210  return
211  end subroutine atmos_phy_mp_driver_tracer_setup
212 
213  !-----------------------------------------------------------------------------
215  subroutine atmos_phy_mp_driver_setup
216  use scale_prc, only: &
217  prc_abort
218  use scale_atmos_grid_cartesc, only: &
220  use scale_const, only: &
221  eps => const_eps
222  use scale_time, only: &
224  use scale_atmos_phy_mp_kessler, only: &
226  use scale_atmos_phy_mp_tomita08, only: &
228  use scale_atmos_phy_mp_sn14, only: &
230  use scale_atmos_phy_mp_suzuki10, only: &
232  use scale_file_history, only: &
234  use scale_monitor, only: &
235  monitor_reg, &
236  monitor_put
237  use mod_atmos_admin, only: &
240  use mod_atmos_phy_mp_vars, only: &
242  sflx_rain => atmos_phy_mp_sflx_rain, &
243  sflx_snow => atmos_phy_mp_sflx_snow
244  use mod_atmos_phy_mp_vars, only: &
245  qs_mp, &
246  qe_mp
247  implicit none
248 
249  namelist / param_atmos_phy_mp / &
250  mp_do_precipitation, &
251  mp_do_negative_fixer, &
252  mp_limit_negative, &
253  mp_ntmax_sedimentation, &
254  mp_max_term_vel, &
255  mp_cldfrac_thleshold
256 
257  real(RP) :: ZERO(ka,ia,ja)
258 
259  integer :: nstep_max
260 
261  integer :: iq
262  integer :: ierr
263  !---------------------------------------------------------------------------
264 
265  log_newline
266  log_info("ATMOS_PHY_MP_driver_setup",*) 'Setup'
267 
268  if ( atmos_sw_phy_mp ) then
269 
270  mp_cldfrac_thleshold = eps
271 
272  !--- read namelist
273  rewind(io_fid_conf)
274  read(io_fid_conf,nml=param_atmos_phy_mp,iostat=ierr)
275  if( ierr < 0 ) then !--- missing
276  log_info("ATMOS_PHY_MP_driver_setup",*) 'Not found namelist. Default used.'
277  elseif( ierr > 0 ) then !--- fatal error
278  log_error("ATMOS_PHY_MP_driver_setup",*) 'Not appropriate names in namelist PARAM_ATMOS_PHY_MP. Check!'
279  call prc_abort
280  endif
281  log_nml(param_atmos_phy_mp)
282 
283  nstep_max = ceiling( ( time_dtsec_atmos_phy_mp * mp_max_term_vel ) / minval( cdz(:) ) )
284  mp_ntmax_sedimentation = max( mp_ntmax_sedimentation, nstep_max )
285 
286  mp_nstep_sedimentation = mp_ntmax_sedimentation
287  mp_rnstep_sedimentation = 1.0_rp / real(mp_ntmax_sedimentation,kind=rp)
288  mp_dtsec_sedimentation = time_dtsec_atmos_phy_mp * mp_rnstep_sedimentation
289 
290  atmos_phy_mp_cldfrac_thleshold = mp_cldfrac_thleshold
291 
292  log_newline
293  log_info("ATMOS_PHY_MP_driver_setup",*) 'Enable negative fixer? : ', mp_do_negative_fixer
294  log_info("ATMOS_PHY_MP_driver_setup",*) 'Value limit of negative fixer (abs) : ', abs(mp_limit_negative)
295  log_info("ATMOS_PHY_MP_driver_setup",*) 'Enable sedimentation (precipitation)? : ', mp_do_precipitation
296  log_info("ATMOS_PHY_MP_driver_setup",*) 'Timestep of sedimentation is divided into : ', mp_ntmax_sedimentation, 'step'
297  log_info("ATMOS_PHY_MP_driver_setup",*) 'DT of sedimentation : ', mp_dtsec_sedimentation, '[s]'
298 
299  select case ( atmos_phy_mp_type )
300  case ( 'KESSLER' )
302  case ( 'TOMITA08' )
304  ka, ks, ke, ia, is, ie, ja, js, je )
305  case ( 'SN14' )
307  ka, ia, ja )
308  case ( 'SUZUKI10' )
310  ka, ia, ja )
311  end select
312 
313  ! history putput
314  if ( mp_do_precipitation ) then
315  allocate( hist_vterm_id(qs_mp+1:qe_mp) )
316  do iq = qs_mp+1, qe_mp
317  call file_history_reg( 'Vterm_'//trim(tracer_name(iq)), 'terminal velocity of '//trim(tracer_name(iq)), 'm/s', hist_vterm_id(iq) )
318  end do
319  end if
320 
321  ! monitor
322  if ( mp_do_negative_fixer ) then
323  call file_history_reg( "RHOH_MP_NF", "sensible heat by the negative fixer", "J/m3/s", & ! [IN]
324  hist_nf_rhoh_id ) ! [OUT]
325  call file_history_reg( "DENS_t_MP_NF", "vapor supply by the negative fixer", "kg/m3/s", & ! [IN]
326  hist_nf_dens_id ) ! [OUT]
327  call file_history_reg( "ENGI_t_MP_NF", "internal energy supply by the negative fixer", "J/m3/s", & ! [IN]
328  hist_nf_engi_id ) ! [OUT]
329  call monitor_reg( "QTOTTND_NF", "vapor supply by the negative fixer", "kg", & ! [IN]
330  monit_nf_mass_id, & ! [OUT]
331  isflux=.true. ) ! [IN]
332  call monitor_reg( "ENGITND_NF", "internal energy supply by the negative fixer", "J", & ! [IN]
333  monit_nf_engi_id, & ! [OUT]
334  isflux=.true. ) ! [IN]
335  zero(:,:,:) = 0.0_rp
336  call monitor_put( monit_nf_mass_id, zero(:,:,:) )
337  call monitor_put( monit_nf_engi_id, zero(:,:,:) )
338  end if
339 
340  else
341 
342  log_info("ATMOS_PHY_MP_driver_setup",*) 'this component is never called.'
343  log_info("ATMOS_PHY_MP_driver_setup",*) 'SFLX_rain and SFLX_snow is set to zero.'
344  sflx_rain(:,:) = 0.0_rp
345  sflx_snow(:,:) = 0.0_rp
346 
347  endif
348 
349 
350  return
351  end subroutine atmos_phy_mp_driver_setup
352 
353  !-----------------------------------------------------------------------------
356  use scale_const, only: &
357  pre00 => const_pre00
358  use scale_atmos_hydrometeor, only: &
360  i_qv, &
361  qla, &
362  qia, &
363  qhs, &
364  qhe
365  use scale_atmos_phy_mp_common, only: &
367  use mod_atmos_vars, only: &
368  temp, &
369  cvtot, &
370  cptot, &
371  dens, &
372  rhot, &
373  qtrc
374  use mod_atmos_phy_mp_vars, only: &
375  qa_mp
376  use scale_time, only: &
377  dt => time_dtsec
378  use scale_file_history, only: &
379  file_history_query, &
380  file_history_put
381  use scale_monitor, only: &
382  monitor_put
383 
384  real(RP) :: rhoh (ka,ia,ja)
385  real(RP) :: DENS_d(ka,ia,ja)
386  real(RP) :: ENGI_d(ka,ia,ja)
387  real(RP) :: Rtot
388 
389  logical :: do_put_rhoh
390  logical :: do_put_dens
391  logical :: do_put_engi
392 
393  integer :: k, i, j, iq
394 
395  if ( mp_do_negative_fixer .and. (.not. atmos_hydrometeor_dry) ) then
396 
397  call file_history_query( hist_nf_rhoh_id, do_put_rhoh )
398  call file_history_query( hist_nf_dens_id, do_put_dens )
399  call file_history_query( hist_nf_engi_id, do_put_engi )
400 
401  if ( monit_nf_mass_id > 0 .or. monit_nf_engi_id > 0 .or. &
402  do_put_rhoh .or. do_put_dens .or. do_put_engi ) then
404  ka, ks, ke, ia, 1, ia, ja, 1, ja, qla, qia, &
405  mp_limit_negative, & ! [IN]
406  dens(:,:,:), temp(:,:,:), & ! [INOUT]
407  cvtot(:,:,:), cptot(:,:,:), & ! [INOUT]
408  qtrc(:,:,:,i_qv), qtrc(:,:,:,qhs:qhe), & ! [INOUT]
409  rhoh = rhoh, & ! [OUT, optional]
410  dens_diff = dens_d, engi_diff = engi_d ) ! [OUT, optional]
411  else
413  ka, ks, ke, ia, 1, ia, ja, 1, ja, qla, qia, &
414  mp_limit_negative, & ! [IN]
415  dens(:,:,:), temp(:,:,:), & ! [INOUT]
416  cvtot(:,:,:), cptot(:,:,:), & ! [INOUT]
417  qtrc(:,:,:,i_qv), qtrc(:,:,:,qhs:qhe) ) ! [INOUT]
418  end if
419 
420  !$omp parallel private(Rtot)
421 
422  !$omp do
423  do j = 1, ja
424  do i = 1, ia
425  do k = ks, ke
426  rtot = cptot(k,i,j) - cvtot(k,i,j)
427  rhot(k,i,j) = pre00 / rtot * ( dens(k,i,j) * temp(k,i,j) * rtot / pre00 )**( cvtot(k,i,j) / cptot(k,i,j) )
428  end do
429  end do
430  end do
431  !$omp end do nowait
432 
433  ! for non-mass tracers, such as number density
434  do iq = qhe+1, qa_mp
435  !$omp do
436  do j = 1, ja
437  do i = 1, ia
438  do k = ks, ke
439  qtrc(k,i,j,iq) = max( qtrc(k,i,j,iq), 0.0_rp )
440  end do
441  end do
442  end do
443  end do
444 
445  !$omp end parallel
446 
447  if ( do_put_rhoh ) then
448  !$omp parallel do
449  do j = js, je
450  do i = is, ie
451  do k = ks, ke
452  rhoh(k,i,j) = rhoh(k,i,j) / dt
453  end do
454  end do
455  end do
456  call file_history_put( hist_nf_rhoh_id, rhoh(:,:,:) )
457  end if
458  if ( monit_nf_mass_id > 0 .or. do_put_dens ) then
459  !$omp parallel do
460  do j = js, je
461  do i = is, ie
462  do k = ks, ke
463  dens_d(k,i,j) = dens_d(k,i,j) / dt
464  end do
465  end do
466  end do
467  call file_history_put( hist_nf_dens_id, dens_d(:,:,:) )
468  call monitor_put( monit_nf_mass_id, dens_d(:,:,:) )
469  end if
470  if ( monit_nf_engi_id > 0 .or. do_put_engi ) then
471  !$omp parallel do
472  do j = js, je
473  do i = is, ie
474  do k = ks, ke
475  engi_d(k,i,j) = engi_d(k,i,j) / dt
476  end do
477  end do
478  end do
479  call file_history_put( hist_nf_engi_id, engi_d(:,:,:) )
480  call monitor_put( monit_nf_engi_id, engi_d(:,:,:) )
481  end if
482 
483  end if
484 
485  return
486  end subroutine atmos_phy_mp_driver_adjustment
487 
488  !-----------------------------------------------------------------------------
490  subroutine atmos_phy_mp_driver_calc_tendency( update_flag )
491  use scale_const, only: &
492  pre00 => const_pre00
493  use scale_time, only: &
494  dt_mp => time_dtsec_atmos_phy_mp
495  use scale_atmos_grid_cartesc_real, only: &
496  real_cz => atmos_grid_cartesc_real_cz, &
497  real_fz => atmos_grid_cartesc_real_fz, &
506  use scale_statistics, only: &
508  statistics_total
509  use scale_file_history, only: &
510  file_history_in
511  use scale_atmos_hydrometeor, only: &
512  i_qv, &
513  n_hyd, &
514  qha, &
515  qhs, &
516  qhe, &
517  qla, &
518  qia
519  use scale_atmos_phy_mp_common, only: &
523  use scale_atmos_refstate, only: &
524  refstate_dens => atmos_refstate_dens
525  use scale_atmos_phy_mp_kessler, only: &
528  use scale_atmos_phy_mp_tomita08, only: &
531  use scale_atmos_phy_mp_sn14, only: &
534  use scale_atmos_phy_mp_suzuki10, only: &
537  use scale_file_history, only: &
538  file_history_query, &
539  file_history_put
540  use mod_atmos_admin, only: &
543  use mod_atmos_vars, only: &
544  dens => dens_av, &
545  momz => momz_av, &
546  u, &
547  v, &
548  w, &
549  pott, &
550  qtrc => qtrc_av, &
551  dens_t => dens_tp, &
552  momz_t => momz_tp, &
553  rhou_t => rhou_tp, &
554  rhov_t => rhov_tp, &
555 ! RHOT_t => RHOT_tp, &
556  rhoq_t => rhoq_tp, &
557  rhoh => rhoh_p, &
558  temp, &
559  pres, &
560  qdry, &
561  cvtot, &
562  cptot, &
563  exner, &
564  rhot => rhot_av
565  use mod_atmos_phy_mp_vars, only: &
566  qa_mp, &
567  qs_mp, &
568  qe_mp, &
569  dens_t_mp => atmos_phy_mp_dens_t, &
570  momz_t_mp => atmos_phy_mp_momz_t, &
571 ! RHOT_t_MP => ATMOS_PHY_MP_RHOT_t, &
572  rhou_t_mp => atmos_phy_mp_rhou_t, &
573  rhov_t_mp => atmos_phy_mp_rhov_t, &
574  rhoq_t_mp => atmos_phy_mp_rhoq_t, &
575  rhoh_mp => atmos_phy_mp_rhoh, &
576  evaporate => atmos_phy_mp_evaporate, &
577  sflx_rain => atmos_phy_mp_sflx_rain, &
578  sflx_snow => atmos_phy_mp_sflx_snow
579  use mod_atmos_phy_ae_vars, only: &
580  ccn_t => atmos_phy_ae_ccn_t
581  implicit none
582 
583  logical, intent(in) :: update_flag
584 
585  real(RP) :: RHOE_t(ka,ia,ja)
586  real(RP) :: TEMP1 (ka,ia,ja)
587  real(RP) :: CPtot1(ka,ia,ja)
588  real(RP) :: CVtot1(ka,ia,ja)
589  real(RP) :: CCN (ka,ia,ja)
590  real(RP) :: vterm (ka,qs_mp+1:qe_mp)
591  real(RP), target :: QTRC1(ka,ia,ja,qs_mp:qe_mp)
592 
593  real(RP) :: FLX_hydro(ka)
594  real(RP) :: DENS2 (ka)
595  real(RP) :: TEMP2 (ka)
596  real(RP) :: PRES2 (ka)
597  real(RP) :: CPtot2 (ka)
598  real(RP) :: CVtot2 (ka)
599  real(RP) :: RHOE (ka)
600  real(RP) :: RHOE2 (ka)
601  real(RP) :: RHOQ2 (ka,qs_mp+1:qe_mp)
602  real(RP) :: mflux (ka)
603  real(RP) :: sflux (2)
604 
605  real(RP) :: FZ (ka)
606  real(RP) :: FDZ (ka)
607  real(RP) :: RFDZ(ka)
608  real(RP) :: RCDZ(ka)
609 
610  real(RP) :: CPtot_t(ka,ia,ja), CVtot_t(ka,ia,ja)
611  real(RP) :: CP_t, CV_t
612 
613  real(RP) :: precip (ia,ja)
614 
615  ! for history output
616  real(RP), allocatable :: vterm_hist(:,:,:,:)
617  integer :: hist_vterm_idx(qs_mp+1:qe_mp)
618  logical :: flag
619  integer :: ih
620 
621  integer :: k, i, j, iq
622  integer :: step
623  !---------------------------------------------------------------------------
624 
625  if ( update_flag ) then
626 
627  ccn(:,:,:) = ccn_t(:,:,:) * dt_mp
628 
629  select case ( atmos_phy_mp_type )
630  case ( 'KESSLER' )
631 !OCL XFILL
632  temp1(:,:,:) = temp(:,:,:)
633 !OCL XFILL
634  qtrc1(:,:,:,qs_mp:qe_mp) = qtrc(:,:,:,qs_mp:qe_mp)
635 !OCL XFILL
636  cvtot1(:,:,:) = cvtot(:,:,:)
637 !OCL XFILL
638  cptot1(:,:,:) = cptot(:,:,:)
639 
641  ka, ks, ke, ia, is, ie, ja, js, je, &
642  dens(:,:,:), pres(:,:,:), dt_mp, & ! [IN]
643  temp1(:,:,:), qtrc1(:,:,:,qs_mp:qe_mp), cptot1(:,:,:), cvtot1(:,:,:), & ! [INOUT]
644  rhoe_t(:,:,:), evaporate(:,:,:) ) ! [OUT]
645 
646  do iq = qs_mp, qe_mp
647  do j = js, je
648  do i = is, ie
649  do k = ks, ke
650  rhoq_t_mp(k,i,j,iq) = ( qtrc1(k,i,j,iq) - qtrc(k,i,j,iq) ) * dens(k,i,j) / dt_mp
651  enddo
652  enddo
653  enddo
654  enddo
655 
656  do j = js, je
657  do i = is, ie
658  do k = ks, ke
659  cptot_t(k,i,j) = ( cptot1(k,i,j) - cptot(k,i,j) ) / dt_mp
660  cvtot_t(k,i,j) = ( cvtot1(k,i,j) - cvtot(k,i,j) ) / dt_mp
661  end do
662  end do
663  end do
664 
665  case ( 'TOMITA08' )
666 !OCL XFILL
667  do j = js, je
668  do i = is, ie
669  do k = ks, ke
670  temp1(k,i,j) = temp(k,i,j)
671  end do
672  end do
673  end do
674 !OCL XFILL
675  do iq = qs_mp, qe_mp
676  do j = js, je
677  do i = is, ie
678  do k = ks, ke
679  qtrc1(k,i,j,iq) = qtrc(k,i,j,iq)
680  end do
681  end do
682  end do
683  end do
684 !OCL XFILL
685  do j = js, je
686  do i = is, ie
687  do k = ks, ke
688  cvtot1(k,i,j) = cvtot(k,i,j)
689  end do
690  end do
691  end do
692 !OCL XFILL
693  do j = js, je
694  do i = is, ie
695  do k = ks, ke
696  cptot1(k,i,j) = cptot(k,i,j)
697  end do
698  end do
699  end do
700 
702  ka, ks, ke, ia, is, ie, ja, js, je, &
703  dens(:,:,:), pres(:,:,:), ccn(:,:,:), dt_mp, & ! [IN]
704  temp1(:,:,:), qtrc1(:,:,:,qs_mp:qe_mp), cptot1(:,:,:), cvtot1(:,:,:), & ! [INOUT]
705  rhoe_t(:,:,:), evaporate(:,:,:) ) ! [OUT]
706 
707  do iq = qs_mp, qe_mp
708  do j = js, je
709  do i = is, ie
710  do k = ks, ke
711  rhoq_t_mp(k,i,j,iq) = ( qtrc1(k,i,j,iq) - qtrc(k,i,j,iq) ) * dens(k,i,j) / dt_mp
712  enddo
713  enddo
714  enddo
715  enddo
716 
717  do j = js, je
718  do i = is, ie
719  do k = ks, ke
720  cptot_t(k,i,j) = ( cptot1(k,i,j) - cptot(k,i,j) ) / dt_mp
721  cvtot_t(k,i,j) = ( cvtot1(k,i,j) - cvtot(k,i,j) ) / dt_mp
722  end do
723  end do
724  end do
725 
726  case ( 'SN14' )
727 
729  ka, ks, ke, ia, is, ie, ja, js, je, &
730  dens(:,:,:), w(:,:,:), qtrc(:,:,:,qs_mp:qe_mp), pres(:,:,:), temp(:,:,:), & ! [IN]
731  qdry(:,:,:), cptot(:,:,:), cvtot(:,:,:), ccn(:,:,:), dt_mp, real_cz(:,:,:), real_fz(:,:,:), & ! [IN]
732  rhoq_t_mp(:,:,:,qs_mp:qe_mp), rhoe_t(:,:,:), cptot_t(:,:,:), cvtot_t(:,:,:), evaporate(:,:,:) ) ! [OUT]
733 
734  case ( 'SUZUKI10' )
735 
737  dt_mp, & ! [IN]
738  dens(:,:,:), pres(:,:,:), temp(:,:,:), & ! [IN]
739  qtrc(:,:,:,qs_mp:qe_mp), qdry(:,:,:), & ! [IN]
740  cptot(:,:,:), cvtot(:,:,:), & ! [IN]
741  ccn(:,:,:), & ! [IN]
742  rhoq_t_mp(:,:,:,qs_mp:qe_mp), & ! [OUT]
743  rhoe_t(:,:,:), & ! [OUT]
744  cptot_t(:,:,:), cvtot_t(:,:,:), & ! [OUT]
745  evaporate(:,:,:) ) ! [OUT]
746 
747  end select
748 
749 
750  do j = js, je
751  do i = is, ie
752  do k = ks, ke
753  rhoh_mp(k,i,j) = rhoe_t(k,i,j) &
754  - ( cptot_t(k,i,j) + log( pres(k,i,j) / pre00 ) * ( cvtot(k,i,j) / cptot(k,i,j) * cptot_t(k,i,j) - cvtot_t(k,i,j) ) ) &
755  * dens(k,i,j) * temp(k,i,j)
756 ! RHOT_t_MP(k,i,j) = RHOE_t(k,i,j) / ( EXNER(k,i,j) * CPtot(k,i,j) ) &
757 ! - RHOT(k,i,j) * CPtot_t(k,i,j) / CPtot(k,i,j) &
758 ! - RHOT(k,i,j) * CVtot(k,i,j) / ( CPtot(k,i,j) - CVtot(k,i,j) ) &
759 ! * log( EXNER(k,i,j) ) * ( CPtot_t(k,i,j) / CPtot(k,i,j) - CVtot_t(k,i,j) / CVtot(k,i,j) )
760  end do
761  end do
762  end do
763 
764  if ( mp_do_precipitation ) then
765 
766  call prof_rapstart('MP_Precipitation', 2)
767 
768  ! prepare for history output
769  hist_vterm_idx(:) = -1
770  ih = 0
771  do iq = qs_mp+1, qe_mp
772  call file_history_query( hist_vterm_id(iq), flag )
773  if ( flag ) then
774  ih = ih + 1
775  hist_vterm_idx(iq) = ih
776  end if
777  end do
778  if ( ih > 0 ) then
779  allocate( vterm_hist(ka,ia,ja,ih) )
780  vterm_hist(:,:,:,:) = 0.0_rp
781  end if
782 
783  !$omp parallel do default(none) OMP_SCHEDULE_ collapse(2) &
784  !$omp shared (KA,KS,KE,IS,IE,JS,JE,QS_MP,QE_MP,QHA,QLA,QIA, &
785  !$omp PRE00, &
786  !$omp ATMOS_PHY_MP_TYPE, ATMOS_PHY_PRECIP_TYPE, &
787  !$omp dt_MP,MP_NSTEP_SEDIMENTATION,MP_DTSEC_SEDIMENTATION,MP_RNSTEP_SEDIMENTATION, &
788  !$omp REAL_CZ,REAL_FZ, &
789  !$omp DENS,MOMZ,U,V,RHOT,TEMP,PRES,QTRC,CPtot,CVtot,EXNER, &
790  !$omp DENS_t_MP,MOMZ_t_MP,RHOU_t_MP,RHOV_t_MP,RHOQ_t_MP,RHOH_MP, &
791  !$omp SFLX_rain,SFLX_snow, &
792  !$omp REFSTATE_dens, &
793  !$omp vterm_hist,hist_vterm_idx) &
794  !$omp private(i,j,k,iq,step, &
795  !$omp FZ,FDZ,RFDZ,RCDZ, &
796  !$omp DENS2,TEMP2,PRES2,CPtot2,CVtot2,RHOE,RHOE2,RHOQ2, &
797  !$omp vterm,mflux,sflux,FLX_hydro,CP_t,CV_t)
798  do j = js, je
799  do i = is, ie
800 
801  fz(1:ka) = real_fz(1:ka,i,j)
802 
803  fdz(ks-1) = real_cz(ks,i,j) - real_fz(ks-1,i,j)
804  rfdz(ks-1) = 1.0_rp / fdz(ks-1)
805  do k = ks, ke
806  fdz(k) = real_cz(k+1,i,j) - real_cz(k ,i,j)
807  rfdz(k) = 1.0_rp / fdz(k)
808  rcdz(k) = 1.0_rp / ( real_fz(k ,i,j) - real_fz(k-1,i,j) )
809  enddo
810 
811  do k = ks, ke
812  dens2(k) = dens(k,i,j)
813  temp2(k) = temp(k,i,j)
814  pres2(k) = pres(k,i,j)
815  cptot2(k) = cptot(k,i,j)
816  cvtot2(k) = cvtot(k,i,j)
817  rhoe(k) = temp(k,i,j) * cvtot(k,i,j) * dens2(k)
818  rhoe2(k) = rhoe(k)
819  end do
820  do iq = qs_mp+1, qe_mp
821  do k = ks, ke
822  rhoq2(k,iq) = dens2(k) * qtrc(k,i,j,iq)
823  end do
824  end do
825 
826  sflx_rain(i,j) = 0.0_rp
827  sflx_snow(i,j) = 0.0_rp
828  flx_hydro(:) = 0.0_rp
829  do step = 1, mp_nstep_sedimentation
830 
831  select case ( atmos_phy_mp_type )
832  case ( 'KESSLER' )
834  ka, ks, ke, &
835  dens2(:), rhoq2(:,:), & ! [IN]
836  refstate_dens(:,i,j), & ! [IN]
837  vterm(:,:) ) ! [OUT]
838  case ( 'TOMITA08' )
840  ka, ks, ke, &
841  dens2(:), temp2(:), rhoq2(:,:), & ! [IN]
842  vterm(:,:) ) ! [OUT]
843  case ( 'SN14' )
845  ka, ks, ke, &
846  dens2(:), temp2(:), rhoq2(:,:), pres2(:), & ! [IN]
847  vterm(:,:) ) ! [OUT]
848  case ( 'SUZUKI10' )
850  ka, & ! [IN]
851  vterm(:,:) ) ! [OUT]
852  case default
853  vterm(:,:) = 0.0_rp ! tentative
854  end select
855 
856  ! store to history output
857  do iq = qs_mp+1, qe_mp
858  if ( hist_vterm_idx(iq) > 0 ) then
859  do k = ks, ke
860  vterm_hist(k,i,j,hist_vterm_idx(iq)) = vterm_hist(k,i,j,hist_vterm_idx(iq)) &
861  + vterm(k,iq) * mp_rnstep_sedimentation
862  end do
863  end if
864  end do
865 
866  select case ( atmos_phy_precip_type )
867  case ( 'Upwind-Euler' )
869  ka, ks, ke, qe_mp-qs_mp, qla, qia, &
870  temp2(:), vterm(:,:), & ! [IN]
871  fdz(:), rcdz(:), & ! [IN]
872  mp_dtsec_sedimentation, & ! [IN]
873  i, j, & ! [IN]
874  dens2(:), rhoq2(:,:), & ! [INOUT]
875  cptot2(:), cvtot2(:), & ! [INOUT]
876  rhoe2(:), & ! [INOUT]
877  mflux(:), sflux(:) ) ! [OUT]
878  case ( 'Semilag' )
880  ka, ks, ke, qe_mp-qs_mp, qla, qia, &
881  temp2(:), vterm(:,:), & ! [IN]
882  fz(:), fdz(:), rcdz(:), & ! [IN]
883  mp_dtsec_sedimentation, & ! [IN]
884  i, j, & ! [IN]
885  dens2(:), rhoq2(:,:), & ! [INOUT]
886  cptot2(:), cvtot2(:), & ! [INOUT]
887  rhoe2(:), & ! [INOUT]
888  mflux(:), sflux(:) ) ! [OUT]
889  case default
890  mflux(:) = 0.0_rp
891  sflux(:) = 0.0_rp
892  end select
893 
894  do k = ks, ke
895  temp2(k) = rhoe2(k) / ( dens2(k) * cvtot2(k) )
896  end do
897 
898  do k = ks-1, ke-1
899  flx_hydro(k) = flx_hydro(k) + mflux(k) * mp_rnstep_sedimentation
900  enddo
901 
902  sflx_rain(i,j) = sflx_rain(i,j) - sflux(1) * mp_rnstep_sedimentation
903  sflx_snow(i,j) = sflx_snow(i,j) - sflux(2) * mp_rnstep_sedimentation
904 
905  enddo
906 
907 !OCL XFILL
908  do k = ks, ke
909  dens_t_mp(k,i,j) = ( dens2(k) - dens(k,i,j) ) / dt_mp
910  end do
911 
912  do k = ks, ke
913  cp_t = ( cptot2(k) - cptot(k,i,j) ) / dt_mp
914  cv_t = ( cvtot2(k) - cvtot(k,i,j) ) / dt_mp
915  rhoh_mp(k,i,j) = rhoh_mp(k,i,j) &
916  + ( rhoe2(k) - rhoe(k) ) / dt_mp &
917  - ( cp_t + log( pres(k,i,j) / pre00 ) * ( cvtot(k,i,j) / cptot(k,i,j) * cp_t - cv_t ) ) &
918  * dens(k,i,j) * temp(k,i,j)
919 ! RHOT_t_MP(k,i,j) = RHOT_t_MP(k,i,j) &
920 ! + ( RHOE2(k) - RHOE(k) ) / ( dt_MP * EXNER(k,i,j) * CPtot(k,i,j) ) &
921 ! - RHOT(k,i,j) * CP_t / CPtot(k,i,j) &
922 ! - RHOT(k,i,j) * CVtot(k,i,j) / ( CPtot(k,i,j) - CVtot(k,i,j) ) &
923 ! * log( EXNER(k,i,j) ) * ( CP_t / CPtot(k,i,j) - CV_t / CVtot(k,i,j) )
924  end do
925 
926  do iq = qs_mp+1, qe_mp
927  do k = ks, ke
928  rhoq_t_mp(k,i,j,iq) = rhoq_t_mp(k,i,j,iq) &
929  + ( rhoq2(k,iq) - dens(k,i,j) * qtrc(k,i,j,iq) ) / dt_mp
930  enddo
931  enddo
932 
934  ka, ks, ke, &
935  dens(:,i,j), momz(:,i,j), u(:,i,j), v(:,i,j), & ! [IN]
936  flx_hydro(:), & ! [IN]
937  rcdz(:), rfdz(:), & ! [IN]
938  momz_t_mp(:,i,j), rhou_t_mp(:,i,j), rhov_t_mp(:,i,j) ) ! [OUT]
939 
940  enddo
941  enddo
942 
943  ! history output
944  do iq = qs_mp+1, qe_mp
945  if ( hist_vterm_idx(iq) > 0 ) &
946  call file_history_put( hist_vterm_id(iq), vterm_hist(:,:,:,hist_vterm_idx(iq)) )
947  end do
948  if ( allocated( vterm_hist ) ) deallocate( vterm_hist )
949 
950  call prof_rapend ('MP_Precipitation', 2)
951 
952  end if
953 
954 !OCL XFILL
955  do j = js, je
956  do i = is, ie
957  precip(i,j) = sflx_rain(i,j) + sflx_snow(i,j)
958  end do
959  end do
960 
961  call file_history_in( sflx_rain(:,:), 'RAIN_MP', 'surface rain rate by MP', 'kg/m2/s', fill_halo=.true. )
962  call file_history_in( sflx_snow(:,:), 'SNOW_MP', 'surface snow rate by MP', 'kg/m2/s', fill_halo=.true. )
963  call file_history_in( precip(:,:), 'PREC_MP', 'surface precipitation rate by MP', 'kg/m2/s', fill_halo=.true. )
964  call file_history_in( evaporate(:,:,:), 'EVAPORATE', 'evaporated cloud number', 'num/m3/s', fill_halo=.true. )
965 
966  call file_history_in( dens_t_mp(:,:,:), 'DENS_t_MP', 'tendency DENS in MP', 'kg/m3/s' , fill_halo=.true. )
967  call file_history_in( momz_t_mp(:,:,:), 'MOMZ_t_MP', 'tendency MOMZ in MP', 'kg/m2/s2' , fill_halo=.true. )
968  call file_history_in( rhou_t_mp(:,:,:), 'RHOU_t_MP', 'tendency RHOU in MP', 'kg/m2/s2' , fill_halo=.true. )
969  call file_history_in( rhov_t_mp(:,:,:), 'RHOV_t_MP', 'tendency RHOV in MP', 'kg/m2/s2' , fill_halo=.true. )
970 ! call FILE_HISTORY_in( RHOT_t_MP(:,:,:), 'RHOT_t_MP', 'tendency RHOT in MP', 'K*kg/m3/s', fill_halo=.true. )
971  call file_history_in( rhoh_mp(:,:,:), 'RHOH_MP', 'diabatic heating rate in MP', 'J/m3/s', fill_halo=.true. )
972  do iq = qs_mp, qe_mp
973  call file_history_in( rhoq_t_mp(:,:,:,iq), trim(tracer_name(iq))//'_t_MP', &
974  'tendency rho*'//trim(tracer_name(iq))//' in MP', 'kg/m3/s', fill_halo=.true. )
975  enddo
976 
977  endif
978 
979  !$omp parallel do default(none) private(i,j,k) OMP_SCHEDULE_ collapse(2) &
980  !$omp shared(KS,KE,IS,IE,JS,JE, &
981  !$omp DENS_t_MP,MOMZ_t_MP,RHOU_t_MP,RHOV_t_MP,RHOH_MP, &
982  !$omp DENS_t,MOMZ_t,RHOU_t,RHOV_t,RHOH)
983  do j = js, je
984  do i = is, ie
985  do k = ks, ke
986  dens_t(k,i,j) = dens_t(k,i,j) + dens_t_mp(k,i,j)
987  momz_t(k,i,j) = momz_t(k,i,j) + momz_t_mp(k,i,j)
988  rhou_t(k,i,j) = rhou_t(k,i,j) + rhou_t_mp(k,i,j)
989  rhov_t(k,i,j) = rhov_t(k,i,j) + rhov_t_mp(k,i,j)
990 ! RHOT_t(k,i,j) = RHOT_t(k,i,j) + RHOT_t_MP(k,i,j)
991  rhoh(k,i,j) = rhoh(k,i,j) + rhoh_mp(k,i,j)
992  enddo
993  enddo
994  enddo
995 
996  do iq = qs_mp, qe_mp
997  !$omp parallel do default(none) private(i,j,k) OMP_SCHEDULE_ &
998  !$omp shared(JS,JE,IS,IE,KS,KE,RHOQ_t,iq,RHOQ_t_MP)
999  do j = js, je
1000  do i = is, ie
1001  do k = ks, ke
1002  rhoq_t(k,i,j,iq) = rhoq_t(k,i,j,iq) + rhoq_t_mp(k,i,j,iq)
1003  enddo
1004  enddo
1005  enddo
1006  enddo
1007 
1008  if ( statistics_checktotal ) then
1009  call statistics_total( ka, ks, ke, ia, is, ie, ja, js, je, &
1010  dens_t_mp(:,:,:), 'DENS_t_MP', &
1011  atmos_grid_cartesc_real_vol(:,:,:), &
1013  call statistics_total( ka, ks, ke, ia, is, ie, ja, js, je, &
1014  momz_t_mp(:,:,:), 'MOMZ_t_MP', &
1017  call statistics_total( ka, ks, ke, ia, is, ie, ja, js, je, &
1018  rhoh_mp(:,:,:), 'RHOH_MP', &
1019  atmos_grid_cartesc_real_vol(:,:,:), &
1021 ! call STATISTICS_total( KA, KS, KE, IA, IS, IE, JA, JS, JE, &
1022 ! RHOT_t_MP(:,:,:), 'RHOT_t_MP', &
1023 ! ATMOS_GRID_CARTESC_REAL_VOL(:,:,:), &
1024 ! ATMOS_GRID_CARTESC_REAL_TOTVOL )
1025 
1026  do iq = qs_mp, qe_mp
1027  call statistics_total( ka, ks, ke, ia, is, ie, ja, js, je, &
1028  rhoq_t_mp(:,:,:,iq), trim(tracer_name(iq))//'_t_MP', &
1029  atmos_grid_cartesc_real_vol(:,:,:), &
1031  enddo
1032  endif
1033 
1034  return
1035  end subroutine atmos_phy_mp_driver_calc_tendency
1036 
1037  subroutine atmos_phy_mp_driver_qhyd2qtrc( &
1038  KA, KS, KE, IA, IS, IE, JA, JS, JE, &
1039  QV, QHYD, &
1040  QTRC, &
1041  QNUM )
1042  use scale_prc, only: &
1043  prc_abort
1044  use scale_atmos_hydrometeor, only: &
1045  n_hyd
1046  use mod_atmos_phy_mp_vars, only: &
1047  qa_mp
1048  use mod_atmos_admin, only: &
1050  use scale_atmos_phy_mp_kessler, only: &
1052  use scale_atmos_phy_mp_tomita08, only: &
1054  use scale_atmos_phy_mp_sn14, only: &
1056  use scale_atmos_phy_mp_suzuki10, only: &
1058  integer, intent(in) :: KA, KS, KE
1059  integer, intent(in) :: IA, IS, IE
1060  integer, intent(in) :: JA, JS, JE
1061 
1062  real(RP), intent(in) :: QV (ka,ia,ja)
1063  real(RP), intent(in) :: QHYD(ka,ia,ja,n_hyd)
1064 
1065  real(RP), intent(out) :: QTRC(ka,ia,ja,qa_mp)
1066 
1067  real(RP), intent(in), optional :: QNUM(ka,ia,ja,n_hyd)
1068 
1069  integer :: k, i, j
1070 
1071  select case( atmos_phy_mp_type )
1072  case ( "NONE" )
1073  if ( associated( atmos_phy_mp_user_qhyd2qtrc ) ) then
1074  call atmos_phy_mp_user_qhyd2qtrc( ka, ks, ke, ia, is, ie, ja, js, je, &
1075  qv(:,:,:), qhyd(:,:,:,:), & ! [IN]
1076  qtrc(:,:,:,:), & ! [OUT]
1077  qnum=qnum ) ! [IN]
1078  end if
1079  case ( "KESSLER" )
1080  !$omp parallel do OMP_SCHEDULE_
1081  do j = js, je
1082  do i = is, ie
1083  do k = ks, ke
1084  qtrc(k,i,j,1) = qv(k,i,j)
1085  end do
1086  end do
1087  end do
1088  call atmos_phy_mp_kessler_qhyd2qtrc( ka, ks, ke, ia, is, ie, ja, js, je, &
1089  qhyd(:,:,:,:), & ! [IN]
1090  qtrc(:,:,:,2:) ) ! [OUT]
1091  case ( "TOMITA08" )
1092  !$omp parallel do OMP_SCHEDULE_
1093  do j = js, je
1094  do i = is, ie
1095  do k = ks, ke
1096  qtrc(k,i,j,1) = qv(k,i,j)
1097  end do
1098  end do
1099  end do
1100  call atmos_phy_mp_tomita08_qhyd2qtrc( ka, ks, ke, ia, is, ie, ja, js, je, &
1101  qhyd(:,:,:,:), & ! [IN]
1102  qtrc(:,:,:,2:) ) ! [OUT]
1103  case ( "SN14" )
1104  !$omp parallel do OMP_SCHEDULE_
1105  do j = js, je
1106  do i = is, ie
1107  do k = ks, ke
1108  qtrc(k,i,j,1) = qv(k,i,j)
1109  end do
1110  end do
1111  end do
1112  call atmos_phy_mp_sn14_qhyd2qtrc( ka, ks, ke, ia, is, ie, ja, js, je, &
1113  qhyd(:,:,:,:), & ! [IN]
1114  qtrc(:,:,:,2:), & ! [OUT]
1115  qnum=qnum ) ! [IN]
1116  case ( "SUZUKI10" )
1117  !$omp parallel do OMP_SCHEDULE_
1118  do j = js, je
1119  do i = is, ie
1120  do k = ks, ke
1121  qtrc(k,i,j,1) = qv(k,i,j)
1122  end do
1123  end do
1124  end do
1125  call atmos_phy_mp_suzuki10_qhyd2qtrc( ka, ks, ke, ia, is, ie, ja, js, je, &
1126  qhyd(:,:,:,:), & ! [IN]
1127  qtrc(:,:,:,2:), & ! [OUT]
1128  qnum=qnum ) ! [IN]
1129  case default
1130  log_error("ATMOS_PHY_MP_driver_qhyd2qtrc",*) 'ATMOS_PHY_MP_TYPE (', trim(atmos_phy_mp_type), ') is not supported'
1131  call prc_abort
1132  end select
1133 
1134  return
1135  end subroutine atmos_phy_mp_driver_qhyd2qtrc
1136 
1137 end module mod_atmos_phy_mp_driver
module ATMOS admin
real(rp), dimension(:,:,:), allocatable, public dens_tp
character(len=h_short), dimension(qa_mp), parameter, public atmos_phy_mp_sn14_tracer_names
integer, parameter, public atmos_phy_mp_tomita08_nices
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.
real(rp), dimension(:,:,:), allocatable, target, public momz
module ATMOSPHERE / Physics Cloud Microphysics
integer, parameter, public atmos_phy_mp_tomita08_nwaters
character(len=h_mid), dimension(qa_mp), parameter, public atmos_phy_mp_tomita08_tracer_descriptions
real(rp), dimension(:,:,:), allocatable, target, public rhot
subroutine, public atmos_phy_mp_suzuki10_setup(KA, IA, JA)
Setup.
real(dp), public time_dtsec_atmos_phy_mp
time interval of physics(microphysics) [sec]
Definition: scale_time.F90:43
integer, public ia
of whole cells: x, local, with HALO
module Atmosphere / Physics Cloud Microphysics
subroutine, public atmos_phy_mp_suzuki10_terminal_velocity(KA, vterm_o)
get terminal velocity
character(len=h_mid), dimension(qa_mp), parameter, public atmos_phy_mp_kessler_tracer_descriptions
module atmosphere / reference state
subroutine, public atmos_phy_mp_tomita08_terminal_velocity(KA, KS, KE, DENS0, TEMP0, RHOQ0, vterm)
Lin-type cold rain microphysics (terminal velocity)
module ATMOSPHERIC Variables
real(rp), dimension(:,:,:,:), pointer, public qtrc_av
integer, parameter, public atmos_phy_mp_kessler_nices
subroutine, public atmos_phy_mp_tomita08_qhyd2qtrc(KA, KS, KE, IA, IS, IE, JA, JS, JE, Qe, QTRC)
get mass ratio of each category
subroutine, public atmos_phy_mp_kessler_qhyd2qtrc(KA, KS, KE, IA, IS, IE, JA, JS, JE, Qe, QTRC)
Calculate mass ratio of each category.
subroutine, public atmos_phy_mp_driver_calc_tendency(update_flag)
calculate tendency
subroutine, public atmos_phy_mp_sn14_setup(KA, IA, JA)
ATMOS_PHY_MP_sn14_setup setup.
real(rp), public atmos_grid_cartesc_real_totvolzxv
total volume (zxv, local) [m3]
real(rp), dimension(:,:,:), allocatable, public atmos_grid_cartesc_real_vol
control volume (zxy) [m3]
real(rp), public atmos_grid_cartesc_real_totvol
total volume (zxy, local) [m3]
real(rp), dimension(:,:,:), allocatable, public atmos_grid_cartesc_real_fz
geopotential height [m] (wxy)
integer, public ja
of whole cells: y, local, with HALO
integer, public io_fid_conf
Config file ID.
Definition: scale_io.F90:55
subroutine, public file_history_reg(name, desc, unit, itemid, standard_name, ndims, dim_type, cell_measures, fill_halo)
Register/Append variable to history file.
real(rp), dimension(:,:,:), allocatable, public atmos_grid_cartesc_real_volzxv
control volume (zxv) [m3]
real(rp), dimension(:,:,:), allocatable, target, public dens
real(rp), dimension(:,:,:), allocatable, public atmos_phy_mp_momz_t
real(rp), dimension(:,:,:), allocatable, public rhov_tp
character(len=h_short), dimension(qa_max), public tracer_name
logical, public statistics_checktotal
calc&report variable totals to logfile?
subroutine, public atmos_phy_mp_driver_adjustment
adjustment
real(rp), dimension(:,:), allocatable, public atmos_phy_mp_sflx_rain
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)
ATMOS_PHY_MP_sn14_tendency calculate tendency.
character(len=h_short), dimension(qa_mp), parameter, public atmos_phy_mp_tomita08_tracer_units
character(len=h_short), dimension(qa_mp), parameter, public atmos_phy_mp_sn14_tracer_units
real(rp), public atmos_grid_cartesc_real_totvolzuy
total volume (zuy, local) [m3]
module ATMOSPHERE / Physics Cloud Microphysics - Common
integer, public is
start point of inner domain: x, local
integer, public ie
end point of inner domain: x, local
module TRACER
module atmosphere / hydrometeor
procedure(qhyd2qtrc), pointer, public atmos_phy_mp_user_qhyd2qtrc
module atmosphere / physics / microphysics / Kessler
subroutine, public atmos_phy_mp_driver_qhyd2qtrc(KA, KS, KE, IA, IS, IE, JA, JS, JE, QV, QHYD, QTRC, QNUM)
real(dp), public time_dtsec
time interval of model [sec]
Definition: scale_time.F90:38
module atmosphere / grid / cartesC index
integer, public ke
end point of inner domain: z, local
integer, parameter, public atmos_phy_mp_sn14_ntracers
real(rp), dimension(:,:,:), allocatable, public atmos_grid_cartesc_real_volwxy
control volume (wxy) [m3]
real(rp), dimension(:,:,:), allocatable, public atmos_refstate_dens
refernce density [kg/m3]
character(len=h_mid), dimension(qa_mp), parameter, public atmos_phy_mp_sn14_tracer_descriptions
subroutine, public atmos_phy_mp_kessler_terminal_velocity(KA, KS, KE, DENS0, RHOQ0, REFSTATE_dens_profile, vterm)
Kessler-type warm rain microphysics (terminal velocity)
real(rp), public const_pre00
pressure reference [Pa]
Definition: scale_const.F90:88
integer, parameter, public atmos_phy_mp_sn14_nwaters
subroutine, public atmos_phy_mp_kessler_setup
ATMOS_PHY_MP_kessler_setup Setup.
module MONITOR
real(rp), dimension(:,:,:), allocatable, public atmos_phy_mp_dens_t
module PROCESS
Definition: scale_prc.F90:11
integer, public je
end point of inner domain: y, local
real(rp), dimension(:), allocatable, public atmos_grid_cartesc_cdz
z-length of control volume [m]
real(rp), dimension(:,:,:), allocatable, target, public temp
character(len=h_short), dimension(qa_mp), parameter, public atmos_phy_mp_kessler_tracer_units
real(rp), dimension(:,:,:), allocatable, target, public w
character(len=h_short), dimension(qa_mp), parameter, public atmos_phy_mp_tomita08_tracer_names
subroutine, public atmos_phy_mp_precipitation_semilag(KA, KS, KE, QHA, QLA, QIA, TEMP, vterm, FZ, FDZ, RCDZ, dt, i, j, DENS, RHOQ, CPtot, CVtot, RHOE, mflx, sflx)
module TIME
Definition: scale_time.F90:16
module atmosphere / grid / cartesC
integer, public ks
start point of inner domain: z, local
subroutine, public atmos_phy_mp_driver_tracer_setup
Config.
real(rp), dimension(:,:,:), allocatable, target, public pott
subroutine, public atmos_phy_mp_driver_setup
Setup.
subroutine, public atmos_phy_mp_precipitation_momentum(KA, KS, KE, DENS, MOMZ, U, V, mflx, RCDZ, RFDZ, MOMZ_t, RHOU_t, RHOV_t)
real(rp), dimension(:,:,:), pointer, public dens_av
subroutine, public prc_abort
Abort Process.
Definition: scale_prc.F90:338
module CONSTANT
Definition: scale_const.F90:11
logical, public atmos_sw_phy_mp
integer, public js
start point of inner domain: y, local
subroutine, public atmos_phy_mp_tomita08_setup(KA, KS, KE, IA, IS, IE, JA, JS, JE)
ATMOS_PHY_MP_tomita08_setup Setup.
integer, parameter, public atmos_phy_mp_sn14_nices
character(len=h_short), public atmos_phy_mp_type
character(len=h_mid), dimension(:), allocatable, public atmos_phy_mp_suzuki10_tracer_descriptions
subroutine, public atmos_phy_mp_sn14_qhyd2qtrc(KA, KS, KE, IA, IS, IE, JA, JS, JE, Qe, QTRC, QNUM)
real(rp), public atmos_grid_cartesc_real_totvolwxy
total volume (wxy, local) [m3]
real(rp), dimension(:,:,:), allocatable, target, public cvtot
subroutine, public atmos_phy_mp_kessler_adjustment(KA, KS, KE, IA, IS, IE, JA, JS, JE, DENS, PRES, dt, TEMP, QTRC, CPtot, CVtot, RHOE_t, EVAPORATE)
ATMOS_PHY_MP_kessler_adjustment calculate state after saturation process.
character(len=h_short), public atmos_phy_precip_type
real(rp), public atmos_phy_mp_cldfrac_thleshold
real(rp), dimension(:,:,:), allocatable, target, public v
subroutine, public atmos_phy_mp_suzuki10_qhyd2qtrc(KA, KS, KE, IA, IS, IE, JA, JS, JE, Qe, QTRC, QNUM)
get mass ratio of each category
subroutine, public prof_rapstart(rapname_base, level)
Start raptime.
Definition: scale_prof.F90:157
character(len=h_short), dimension(:), allocatable, public atmos_phy_mp_suzuki10_tracer_units
real(rp), dimension(:,:,:), allocatable, target, public u
real(rp), dimension(:,:), allocatable, public atmos_phy_mp_sflx_snow
real(rp), dimension(:,:,:), allocatable, public momz_tp
real(rp), dimension(:,:,:), allocatable, public atmos_grid_cartesc_real_cz
geopotential height [m] (zxy)
module profiler
Definition: scale_prof.F90:11
subroutine, public atmos_hydrometeor_regist(NL, NI, NAME, DESC, UNIT, Q0, ADVC)
ATMOS_HYDROMETEOR_regist Regist tracer.
real(rp), public const_eps
small number
Definition: scale_const.F90:33
subroutine, public atmos_phy_mp_precipitation_upwind(KA, KS, KE, QHA, QLA, QIA, TEMP, vterm, FDZ, RCDZ, dt, i, j, DENS, RHOQ, CPtot, CVtot, RHOE, mflx, sflx)
module Atmosphere GRID CartesC Real(real space)
character(len=h_short), dimension(:), allocatable, public atmos_phy_mp_suzuki10_tracer_names
module PRECISION
character(len=h_short), dimension(qa_mp), parameter, public atmos_phy_mp_kessler_tracer_names
real(rp), dimension(:,:,:), allocatable, public rhou_tp
integer, public ka
of whole cells: z, local, with HALO
real(rp), dimension(:,:,:), pointer, public momz_av
subroutine, public atmos_phy_mp_tomita08_adjustment(KA, KS, KE, IA, IS, IE, JA, JS, JE, DENS, PRES, CCN, dt, TEMP, QTRC, CPtot, CVtot, RHOE_t, EVAPORATE)
ATMOS_PHY_MP_tomita08_adjustment calculate state after saturation process.
module Statistics
real(rp), dimension(:,:,:), allocatable, target, public cptot
subroutine, public tracer_regist(QS, NQ, NAME, DESC, UNIT, CV, CP, R, ADVC, MASS)
Regist tracer.
subroutine, public atmos_phy_mp_suzuki10_tracer_setup
Config.
module STDIO
Definition: scale_io.F90:10
integer, parameter, public n_hyd
subroutine, public monitor_reg(name, desc, unit, itemid, ndims, dim_type, isflux)
Search existing item, or matching check between requested and registered item.
module atmosphere / physics / microphysics / Tomita08
module Spectran Bin Microphysics
module atmosphere / physics / cloud microphysics
subroutine, public prof_rapend(rapname_base, level)
Save raptime.
Definition: scale_prof.F90:210
integer, parameter, public rp
integer, parameter, public atmos_phy_mp_tomita08_ntracers
module ATMOSPHERE / Physics Aerosol Microphysics
real(rp), dimension(:,:,:), allocatable, public atmos_grid_cartesc_real_volzuy
control volume (zuy) [m3]
integer, public kijmax
of computational cells: z*x*y
subroutine, public atmos_phy_mp_suzuki10_tendency(KA, KS, KE, IA, IS, IE, JA, JS, JE, KIJMAX, dt, DENS, PRES, TEMP, QTRC, QDRY, CPtot, CVtot, CCN, RHOQ_t, RHOE_t, CPtot_t, CVtot_t, EVAPORATE)
Cloud Microphysics.
integer, parameter, public atmos_phy_mp_kessler_nwaters
module file_history
real(rp), dimension(:,:,:,:), allocatable, target, public qtrc
subroutine, public atmos_phy_mp_negative_fixer(KA, KS, KE, IA, IS, IE, JA, JS, JE, QLA, QIA, limit_negative, DENS, TEMP, CVtot, CPtot, QV, QTRC, RHOH, DENS_diff, ENGI_diff)
ATMOS_PHY_MP_negative_fixer negative fixer.
integer, parameter, public atmos_phy_mp_kessler_ntracers
real(rp), dimension(:,:,:), allocatable, public atmos_phy_ae_ccn_t