19 #elif defined(_OPENMP)
65 integer,
private :: ITMAX = 3000
66 real(RP),
private :: epsilon = 0.1_rp ** (rp*2)
67 character(len=64),
private :: NUTR_TYPE=
'F2013'
68 character(len=64),
private,
save :: NUTR_qhyd=
'Each_POLARITY2'
69 integer,
private :: MAX_NUTR = 100
70 real(RP),
private :: Eint = 150.0e+3_rp
71 real(RP),
private :: delEint = 10.0e+3_rp
72 real(RP),
private :: Estop = 15.0e+3_rp
73 real(RP),
private :: qrho_chan = 0.5_rp
74 real(RP),
private :: qrho_neut = 0.5_rp
75 real(RP),
private :: fp = 0.3_rp
76 real(RP),
private :: zcg = 0.0_rp
77 integer,
private :: NUTR_ITMAX = 1000
78 integer,
private :: FLAG_preprocessing = 2
82 integer,
private :: KIJMAXG
83 character(len=H_LONG) :: ATMOS_PHY_LT_LUT_FILENAME
84 character(len=H_LONG) :: fname_lut_lt=
"LUT_TK1978_v.txt"
85 integer,
save :: fid_lut_lt
86 real(RP),
private :: R_neut = 2000.0_rp
87 real(RP),
private :: rho0 = 1.225_rp
88 real(RP),
save :: flg_eint_hgt
89 logical,
private :: LT_DO_Lightning = .true.
92 real(RP),
allocatable,
private :: d_QCRG_TOT(:,:,:)
93 real(RP),
allocatable,
private :: LT_PATH_TOT(:,:,:,:)
94 real(RP),
allocatable,
private :: fls_int_p_tot(:,:,:)
95 real(RP),
allocatable,
private :: B_F2013_TOT(:,:)
96 real(RP),
allocatable,
private :: G_F2013(:,:)
97 real(RP),
private :: C_F2013
99 real(RP),
allocatable,
private :: A(:,:,:,:)
103 integer,
parameter,
private :: nxlut_lt = 200, nylut_lt = 200
104 real(RP),
private :: dq_chrg( nxlut_lt,nylut_lt )
105 real(RP),
private :: grid_lut_t( nxlut_lt )
106 real(RP),
private :: grid_lut_l( nylut_lt )
108 real(RP),
private :: tcrglimit
109 logical,
private :: Hgt_dependency_Eint = .false.
112 integer,
private,
parameter :: I_lt_x = 1
113 integer,
private,
parameter :: I_lt_y = 2
114 integer,
private,
parameter :: I_lt_z = 3
115 integer,
private,
parameter :: I_lt_abs = 4
118 integer,
private,
parameter :: w_nmax = 11
119 integer,
private,
parameter :: I_Ex = 1
120 integer,
private,
parameter :: I_Ey = 2
121 integer,
private,
parameter :: I_Ez = 3
122 integer,
private,
parameter :: I_Eabs = 4
123 integer,
private,
parameter :: I_Epot = 5
124 integer,
private,
parameter :: I_Qneut = 6
125 integer,
private,
parameter :: I_LTpath = 7
126 integer,
private,
parameter :: I_PosFLASH = 8
127 integer,
private,
parameter :: I_NegFLASH = 9
128 integer,
private,
parameter :: I_FlashPoint = 10
129 integer,
private,
parameter :: I_FOD = 11
130 integer,
private :: HIST_id(w_nmax)
131 character(len=H_SHORT),
private :: w_name(w_nmax)
132 character(len=H_MID),
private :: w_longname(w_nmax)
133 character(len=H_SHORT),
private :: w_unit(w_nmax)
134 data w_name /
'Ex', &
146 'X component of Electrical Field', &
147 'Y component of Electrical Field', &
148 'Z component of Electrical Field', &
149 'Absolute value of Electrical Field', &
150 'Electric Potential', &
151 'Cumulative Neutralizated charge', &
152 'Cumulative Number of flash path', &
153 'Cumulative Number of Positive flash', &
154 'Cumulative Number of Negative flash', &
155 'Cumulative Number of Flash point', &
156 'Flash Origin Density' /
219 integer,
intent(in) :: ka, ks, ke
220 integer,
intent(in) :: ia, is, ie
221 integer,
intent(in) :: ja, js, je
222 integer,
intent(in) :: imaxg
223 integer,
intent(in) :: jmaxg
224 integer,
intent(in) :: kmax
226 character(len=*),
intent(in) :: mp_type
227 real(rp),
intent(in) :: cdx(ia)
228 real(rp),
intent(in) :: cdy(ja)
230 integer :: n, myu, ip
234 namelist / param_atmos_phy_lt_sato2019 / &
236 atmos_phy_lt_lut_filename, &
250 hgt_dependency_eint, &
256 read(
io_fid_conf,nml=param_atmos_phy_lt_sato2019,iostat=ierr)
259 log_info(
"ATMOS_PHY_LT_sato2019_setup",*)
'*** Not found namelist. Default used.'
260 elseif( ierr > 0 )
then
261 log_error(
"ATMOS_PHY_LT_sato2019_setup",*)
'xxx Not appropriate names in namelist PARAM_ATMOS_PHY_LT_SATO2019. Check!'
264 log_nml(param_atmos_phy_lt_sato2019)
267 if( zcg <= cz(ks) )
then
271 if( r_neut <= minval( cdx,1 ) .or. r_neut <= minval( cdy,1 ) )
then
272 r_neut = 2.d0 * min( minval( cdx,1 ), minval( cdy,1 ) )
277 fname_lut_lt = atmos_phy_lt_lut_filename
280 open ( fid_lut_lt, file = fname_lut_lt, form =
'formatted', status =
'old', iostat=ierr )
282 if ( ierr == 0 )
then
283 log_info(
"ATMOS_PHY_LT_sato2019_setup",
'(2A)')
'Read LUT of TK78 table from ', trim(fname_lut_lt)
287 read( fid_lut_lt,* ) grid_lut_t( myu ), grid_lut_l( n ), dq_chrg( myu,n )
293 log_error(
"ATMOS_PHY_LT_sato2019_setup",*)
'xxx LUT for LT is requied when ATMOS_PHY_LT_TYPE = SATO2019, stop!'
297 if( nutr_type /=
'MG2001' .and. nutr_type /=
'F2013' )
then
298 log_error(
"ATMOS_PHY_LT_sato2019_setup",*)
'xxx NUTR_TYPE should be MG2001 or F2013 stop!'
303 call comm_bcast( nxlut_lt, nylut_lt, dq_chrg )
304 call comm_bcast( nxlut_lt, grid_lut_t )
305 call comm_bcast( nylut_lt, grid_lut_l )
308 kijmaxg = imaxg*jmaxg*kmax
311 allocate( d_qcrg_tot(ka,ia,ja) )
312 allocate( lt_path_tot(ka,ia,ja,3) )
313 allocate( fls_int_p_tot(ka,ia,ja) )
314 d_qcrg_tot(:,:,:) = 0.0_rp
315 lt_path_tot(:,:,:,:) = 0.0_rp
316 fls_int_p_tot(:,:,:) = 0.0_rp
319 tcrglimit = -60.0_rp+t00
321 if( nutr_type ==
'F2013' )
then
322 log_info(
"ATMOS_PHY_LT_sato2019_setup",
'(A,F15.7,A)')
'Radius of neutralization is ', r_neut,
"[m]"
324 allocate( b_f2013_tot(ia,ja) )
325 allocate( g_f2013(ia,ja) )
326 b_f2013_tot(:,:) = 0.0_rp
329 g_f2013(i,j) = cdx(i)*cdy(j)*1.0e-6_rp
333 c_f2013 = pi*r_neut*r_neut*1.0e-6_rp
335 flg_eint_hgt = 0.0_rp
336 if( hgt_dependency_eint .and. nutr_type ==
'MG2001')
then
337 flg_eint_hgt = 1.0_rp
340 if( nutr_qhyd /=
'TOTAL' .and. nutr_qhyd /=
'Each_POLARITY' .and. nutr_qhyd /=
'Each_POLARITY2' )
then
341 log_error(
"ATMOS_PHY_LT_sato2019_setup",*)
'xxx NUTR_qhyd should be TOTAL, or Each_POLARITY, or Each_POLARITY2, stop!'
351 if( ip /= i_fod )
then
354 elseif( ip == i_fod )
then
356 hist_id(ip), dim_type=
'XY' )
360 allocate( a(ka,15,ia,ja) )
368 - mapf(i,j ,1,
i_xy)*mapf(i,j ,1,
i_xy)*rcdx(i )*rfdx(i) &
369 - mapf(i,j ,1,
i_xy)*mapf(i,j ,1,
i_xy)*rcdx(i-1)*rfdx(i) &
370 + mapf(i,j ,1,
i_xy)*j13g(k,i ,j,
i_uyz)*f2h(k ,i,j,2)*0.5_rp*rfdx(i)*rfdz(k) &
371 - mapf(i,j ,1,
i_xy)*j13g(k,i ,j,
i_uyz)*f2h(k-1,i,j,1)*0.5_rp*rfdx(i)*rfdz(k) &
372 - mapf(i,j ,1,
i_xy)*j13g(k,i-1,j,
i_uyz)*f2h(k ,i,j,2)*0.5_rp*rfdx(i)*rfdz(k) &
373 + mapf(i,j ,1,
i_xy)*j13g(k,i-1,j,
i_uyz)*f2h(k-1,i,j,1)*0.5_rp*rfdx(i)*rfdz(k) &
374 - j13g(k,i,j,
i_xyz)*j13g(k ,i,j,
i_xyw)*rcdz(k)*rfdz(k) &
375 - j13g(k,i,j,
i_xyz)*j13g(k-1,i,j,
i_xyw)*rcdz(k)*rfdz(k) &
376 - mapf(i,j ,2,
i_xy)*mapf(i,j ,2,
i_xy)*rcdy(j )*rfdy(j) &
377 - mapf(i,j ,2,
i_xy)*mapf(i,j ,2,
i_xy)*rcdy(j-1)*rfdy(j) &
378 + mapf(i,j ,2,
i_xy)*j23g(k,i,j ,
i_xvz)*f2h(k ,i,j,2)*0.5_rp*rfdy(j)*rfdz(k) &
379 - mapf(i,j ,2,
i_xy)*j23g(k,i,j ,
i_xvz)*f2h(k-1,i,j,1)*0.5_rp*rfdy(j)*rfdz(k) &
380 - mapf(i,j ,2,
i_xy)*j23g(k,i,j-1,
i_xvz)*f2h(k ,i,j,2)*0.5_rp*rfdy(j)*rfdz(k) &
381 + mapf(i,j ,2,
i_xy)*j23g(k,i,j-1,
i_xvz)*f2h(k-1,i,j,1)*0.5_rp*rfdy(j)*rfdz(k) &
382 - j23g(k,i,j,
i_xyz)*j23g(k ,i,j,
i_xyw)*rcdz(k)*rfdz(k) &
383 - j23g(k,i,j,
i_xyz)*j23g(k-1,i,j,
i_xyw)*rcdz(k)*rfdz(k) &
384 - j33g*j33g*rfdz(k)*rcdz(k) &
385 - j33g*j33g*rfdz(k)*rcdz(k-1)
389 - mapf(i,j,1,
i_xy)*j13g(k,i ,j,
i_uyz)*f2h(k-1,i,j,2)*0.50_rp*rfdx(i)*rfdz(k) &
390 + mapf(i,j,1,
i_xy)*j13g(k,i-1,j,
i_uyz)*f2h(k-1,i,j,2)*0.50_rp*rfdx(i)*rfdz(k) &
391 + j13g(k,i,j,
i_xyz)*j13g(k-1,i,j,
i_xyw)*rfdz(k)*rcdz(k-1) &
392 - mapf(i,j,2,
i_xy)*j23g(k,i,j ,
i_xvz)*f2h(k-1,i,j,2)*0.50_rp*rfdy(j)*rfdz(k) &
393 + mapf(i,j,2,
i_xy)*j23g(k,i,j-1,
i_xvz)*f2h(k-1,i,j,2)*0.50_rp*rfdy(j)*rfdz(k) &
394 + j23g(k,i,j,
i_xyz)*j23g(k-1,i,j,
i_xyw)*rfdz(k)*rcdz(k-1) &
395 + j33g*j33g*rfdz(k)*rcdz(k-1)
399 mapf(i,j,1,
i_xy)*j13g(k,i ,j,
i_uyz)*f2h(k,i,j,1)*0.50_rp*rfdx(i)*rfdz(k) &
400 - mapf(i,j,1,
i_xy)*j13g(k,i-1,j,
i_uyz)*f2h(k,i,j,1)*0.50_rp*rfdx(i)*rfdz(k) &
401 + j13g(k,i,j,
i_xyz)*j13g(k,i,j,
i_xyw)*rfdz(k)*rcdz(k) &
402 + mapf(i,j,2,
i_xy)*j23g(k,i,j ,
i_xvz)*f2h(k,i,j,1)*0.50_rp*rfdy(j)*rfdz(k) &
403 - mapf(i,j,2,
i_xy)*j23g(k,i,j-1,
i_xvz)*f2h(k,i,j,1)*0.50_rp*rfdy(j)*rfdz(k) &
404 + j23g(k,i,j,
i_xyz)*j23g(k,i,j,
i_xyw)*rfdz(k)*rcdz(k) &
405 + j33g*j33g*rfdz(k)*rcdz(k)
409 mapf(i,j,1,
i_xy)*mapf(i-1,j,1,
i_xy)*rfdx(i)*rcdx(i-1) &
410 - mapf(i,j,1,
i_xy)*j13g(k,i-1,j,
i_uyz)*f2h(k ,i-1,j,2)*0.50_rp*rfdx(i)*rfdz(k) &
411 + mapf(i,j,1,
i_xy)*j13g(k,i-1,j,
i_uyz)*f2h(k-1,i-1,j,1)*0.50_rp*rfdx(i)*rfdz(k) &
412 - j13g(k,i,j,
i_xyz)*mapf(i,j,1,
i_xy)*f2h(k ,i-1,j,2)*0.50_rp*rfdx(i)*rfdz(k) &
413 + j13g(k,i,j,
i_xyz)*mapf(i,j,1,
i_xy)*f2h(k-1,i-1,j,1)*0.50_rp*rfdx(i)*rfdz(k)
417 mapf(i,j,1,
i_xy)*mapf(i+1,j,1,
i_xy)*rfdx(i)*rcdx(i) &
418 + mapf(i,j,1,
i_xy)*j13g(k,i,j,
i_uyz)*f2h(k ,i+1,j,2)*0.50_rp*rfdx(i)*rfdz(k) &
419 - mapf(i,j,1,
i_xy)*j13g(k,i,j,
i_uyz)*f2h(k-1,i+1,j,1)*0.50_rp*rfdx(i)*rfdz(k) &
420 + j13g(k,i,j,
i_xyz)*mapf(i,j,1,
i_xy)*f2h(k ,i+1,j,2)*0.50_rp*rfdx(i)*rfdz(k) &
421 - j13g(k,i,j,
i_xyz)*mapf(i,j,1,
i_xy)*f2h(k-1,i+1,j,1)*0.50_rp*rfdx(i)*rfdz(k)
425 mapf(i,j,2,
i_xy)*mapf(i,j-1,2,
i_xy)*rfdy(j)*rcdy(j-1) &
426 - mapf(i,j,2,
i_xy)*j23g(k,i,j-1,
i_xvz)*f2h(k ,i,j-1,2)*0.50_rp*rfdy(j)*rfdz(k) &
427 + mapf(i,j,2,
i_xy)*j23g(k,i,j-1,
i_xvz)*f2h(k-1,i,j-1,1)*0.50_rp*rfdy(j)*rfdz(k) &
428 - j23g(k,i,j,
i_xyz)*mapf(i,j,2,
i_xy)*f2h(k ,i,j-1,2)*0.50_rp*rfdy(j)*rfdz(k) &
429 + j23g(k,i,j,
i_xyz)*mapf(i,j,2,
i_xy)*f2h(k-1,i,j-1,1)*0.50_rp*rfdy(j)*rfdz(k)
433 mapf(i,j,2,
i_xy)*mapf(i,j+1,2,
i_xy)*rfdy(j)*rcdy(j) &
434 + mapf(i,j,2,
i_xy)*j23g(k,i,j,
i_xvz)*f2h(k ,i,j+1,2)*0.50_rp*rfdy(j)*rfdz(k) &
435 - mapf(i,j,2,
i_xy)*j23g(k,i,j,
i_xvz)*f2h(k-1,i,j+1,1)*0.50_rp*rfdy(j)*rfdz(k) &
436 + j23g(k,i,j,
i_xyz)*mapf(i,j,2,
i_xy)*f2h(k ,i,j+1,2)*0.50_rp*rfdy(j)*rfdz(k) &
437 - j23g(k,i,j,
i_xyz)*mapf(i,j,2,
i_xy)*f2h(k-1,i,j+1,1)*0.50_rp*rfdy(j)*rfdz(k)
441 mapf(i,j,1,
i_xy)*j13g(k,i-1,j,
i_uyz)*f2h(k-1,i-1,j,2)*0.5_rp*rfdx(i)*rfdz(k) &
442 + j13g(k,i,j,
i_xyz)*mapf(i,j,1,
i_xy)*f2h(k-1,i-1,j,2)*0.5_rp*rfdx(i)*rfdz(k)
446 - mapf(i,j,1,
i_xy)*j13g(k,i,j,
i_uyz)*f2h(k-1,i+1,j,2)*0.5_rp*rfdx(i)*rfdz(k) &
447 - j13g(k,i,j,
i_xyz)*mapf(i,j,1,
i_xy)*f2h(k-1,i+1,j,2)*0.5_rp*rfdx(i)*rfdz(k)
451 mapf(i,j,2,
i_xy)*j23g(k,i,j-1,
i_xvz)*f2h(k-1,i,j-1,2)*0.5_rp*rfdy(j)*rfdz(k) &
452 + j23g(k,i,j,
i_xyz)*mapf(i,j,2,
i_xy)*f2h(k-1,i,j-1,2)*0.5_rp*rfdy(j)*rfdz(k)
456 - mapf(i,j,2,
i_xy)*j23g(k,i,j,
i_xvz)*f2h(k-1,i,j+1,2)*0.5_rp*rfdy(j)*rfdz(k) &
457 - j23g(k,i,j,
i_xyz)*mapf(i,j,2,
i_xy)*f2h(k-1,i,j+1,2)*0.5_rp*rfdy(j)*rfdz(k)
461 - mapf(i,j,1,
i_xy)*j13g(k,i-1,j,
i_uyz)*f2h(k,i-1,j,1)*0.5_rp*rfdx(i)*rfdz(k) &
462 - j13g(k,i,j,
i_xyz)*mapf(i,j,1,
i_xy)*f2h(k,i-1,j,1)*0.5_rp*rfdx(i)*rfdz(k)
466 mapf(i,j,1,
i_xy)*j13g(k,i,j,
i_uyz)*f2h(k,i+1,j,1)*0.5_rp*rfdx(i)*rfdz(k) &
467 + j13g(k,i,j,
i_xyz)*mapf(i,j,1,
i_xy)*f2h(k,i+1,j,1)*0.5_rp*rfdx(i)*rfdz(k)
471 - mapf(i,j,2,
i_xy)*j23g(k,i,j-1,
i_xvz)*f2h(k,i,j-1,1)*0.5_rp*rfdy(j)*rfdz(k) &
472 - j23g(k,i,j,
i_xyz)*mapf(i,j,2,
i_xy)*f2h(k,i,j-1,1)*0.5_rp*rfdy(j)*rfdz(k)
476 mapf(i,j,2,
i_xy)*j23g(k,i,j,
i_xvz)*f2h(k,i,j+1,1)*0.5_rp*rfdy(j)*rfdz(k) &
477 + j23g(k,i,j,
i_xyz)*mapf(i,j,2,
i_xy)*f2h(k,i,j+1,1)*0.5_rp*rfdy(j)*rfdz(k)
493 deallocate( d_qcrg_tot )
494 deallocate( lt_path_tot )
495 deallocate( fls_int_p_tot )
497 deallocate( b_f2013_tot )
498 deallocate( g_f2013 )
533 file_history_query, &
537 integer,
intent(in) :: ka, ks, ke
538 integer,
intent(in) :: ia, is, ie
539 integer,
intent(in) :: ja, js, je
540 integer,
intent(in) :: kijmax
541 integer,
intent(in) :: imax
542 integer,
intent(in) :: jmax
544 integer,
intent(in) :: qa_lt
545 real(rp),
intent(in) :: dens(ka,ia,ja)
546 real(rp),
intent(in) :: rhot(ka,ia,ja)
547 real(rp),
intent(in) :: qhyd(ka,ia,ja)
548 real(rp),
intent(in) :: sarea(ka,ia,ja,qa_lt)
549 real(
dp),
intent(in) :: dt_lt
550 real(rp),
intent(inout) :: qtrc(ka,ia,ja,qa_lt)
551 real(rp),
intent(inout) :: epot(ka,ia,ja)
553 real(rp) :: qhyd_mass(ka,ia,ja)
554 real(rp) :: qcrg(ka,ia,ja)
555 real(rp) :: efield(ka,ia,ja,i_lt_abs)
556 real(rp) :: num_end(ka,ia,ja,3)
557 real(rp) :: d_qcrg(ka,ia,ja)
558 real(rp) :: lt_path(ka,ia,ja)
559 real(rp) :: fls_int_p(ka,ia,ja)
560 real(rp) :: total_sarea1, total_sarea2
561 real(rp) :: r_totalsarea1, r_totalsarea2
562 real(rp) :: neg_crg, pos_crg
564 real(rp) :: dqneut(ka,ia,ja,qa_lt)
565 real(rp) :: dqneut_real(ka,ia,ja,qa_lt)
566 real(rp) :: dqneut_real_tot(ka,ia,ja)
567 logical :: flg_chrged(qa_lt)
568 real(rp) :: emax, emax_old
569 logical :: output_step
570 integer :: flg_lt_neut
571 integer :: i, j, k, m, n, countbin, ip
572 real(rp) :: sw, zerosw, positive, negative
573 integer :: count_neut
575 logical :: hist_sw(w_nmax)
576 real(rp) :: w3d(ka,ia,ja)
578 real(rp) :: diff_qcrg(0:1), lack(0:1), sum_crg(0:1)
579 real(rp) :: crg_rate(qa_lt), qcrg_before(qa_lt)
580 real(rp) :: b_f2013(ia,ja)
582 real(rp) :: iprod, buf, tmp_qcrg, tmp_dqcrg
593 num_end(:,:,:,:) = 0.0_rp
594 b_f2013(:,:) = 0.0_rp
608 tmp_qcrg = tmp_qcrg + qtrc(k,i,j,n)
610 qcrg(k,i,j) = tmp_qcrg * dens(k,i,j) * 1.e-6_rp
614 qhyd_mass(k,i,j) = qhyd(k,i,j) * dens(k,i,j)
628 iprod = iprod + abs( qcrg(k,i,j) )
636 if( buf <= small )
then
645 efield(k,i,j,i_lt_x) = 0.0_rp
646 efield(k,i,j,i_lt_y) = 0.0_rp
647 efield(k,i,j,i_lt_z) = 0.0_rp
663 efield(:,:,:,i_lt_x:i_lt_z) )
673 efield(k,i,j,i_lt_abs) = sqrt( efield(k,i,j,i_lt_x)*efield(k,i,j,i_lt_x) &
674 + efield(k,i,j,i_lt_y)*efield(k,i,j,i_lt_y) &
675 + efield(k,i,j,i_lt_z)*efield(k,i,j,i_lt_z) )
677 lt_path(k,i,j) = 0.0_rp
684 if ( lt_do_lightning )
then
687 d_qcrg_tot(:,:,:) = 0.0_rp
688 fls_int_p_tot(:,:,:) = 0.0_rp
689 lt_path_tot(:,:,:,:) = 0.0_rp
690 b_f2013_tot(:,:) = 0.0_rp
697 efield(:,:,:,i_lt_abs), &
702 do while( flg_lt_neut > 0 )
706 call comm_vars8( efield(:,:,:,i_lt_x), 1 )
707 call comm_vars8( efield(:,:,:,i_lt_y), 2 )
708 call comm_vars8( efield(:,:,:,i_lt_z), 3 )
709 call comm_vars8( efield(:,:,:,i_lt_abs), 4 )
710 call comm_vars8( qhyd_mass(:,:,:), 5 )
711 call comm_vars8( qcrg(:,:,:), 6 )
712 call comm_vars8( epot(:,:,:), 7 )
713 call comm_wait ( efield(:,:,:,i_lt_x), 1 )
714 call comm_wait ( efield(:,:,:,i_lt_y), 2 )
715 call comm_wait ( efield(:,:,:,i_lt_z), 3 )
716 call comm_wait ( efield(:,:,:,i_lt_abs), 4 )
717 call comm_wait ( qhyd_mass(:,:,:), 5 )
718 call comm_wait ( qcrg(:,:,:), 6 )
719 call comm_wait ( epot(:,:,:), 7 )
722 if( nutr_type ==
'MG2001' )
then
728 kijmax, imax, jmax, &
739 elseif( nutr_type ==
'F2013' )
then
757 call comm_vars8( lt_path(:,:,:),1 )
758 call comm_vars8( d_qcrg(:,:,:),2 )
759 call comm_wait ( lt_path(:,:,:),1 )
760 call comm_wait ( d_qcrg(:,:,:),2 )
763 dqneut(:,:,:,:) = 0.0_rp
764 dqneut_real(:,:,:,:) = 0.0_rp
768 select case( nutr_qhyd )
778 if( abs( d_qcrg(k,i,j) ) > 0.0_rp )
then
779 total_sarea1 = 0.0_rp
782 total_sarea1 = total_sarea1 + sarea(k,i,j,n)
784 zerosw = 0.5_rp - sign( 0.5_rp, total_sarea1-small )
785 r_totalsarea1 = 1.0_rp / ( total_sarea1 + zerosw ) * ( 1.0_rp - zerosw )
788 dqneut(k,i,j,n) = d_qcrg(k,i,j)*1.0e+6_rp &
789 * sarea(k,i,j,n) * r_totalsarea1 / dens(k,i,j)
790 qtrc(k,i,j,n) = qtrc(k,i,j,n) + dqneut(k,i,j,n)
791 dqneut_real(k,i,j,n) = dqneut(k,i,j,n)
799 case (
'Each_POLARITY',
'Each_POLARITY2' )
812 if( abs( d_qcrg(k,i,j) ) > 0.0_rp )
then
817 flg_chrged(n) = abs(qtrc(k,i,j,n)) >= small
820 total_sarea1 = 0.0_rp
821 total_sarea2 = 0.0_rp
826 if ( flg_chrged(n) )
then
827 positive = 0.5_rp + sign( 0.5_rp, qtrc(k,i,j,n) )
828 negative = 1.0_rp - positive
830 pos_crg = pos_crg + qtrc(k,i,j,n) * positive
832 neg_crg = neg_crg + qtrc(k,i,j,n) * negative
834 total_sarea1 = total_sarea1 + sarea(k,i,j,n) * positive
836 total_sarea2 = total_sarea2 + sarea(k,i,j,n) * negative
840 zerosw = 0.5_rp - sign( 0.5_rp, abs( qcrg(k,i,j) ) - small )
841 frac = d_qcrg(k,i,j) / ( qcrg(k,i,j) + zerosw ) * ( 1.0_rp - zerosw )
842 pos_crg = frac * pos_crg
843 neg_crg = frac * neg_crg
846 zerosw = 0.5_rp - sign( 0.5_rp, total_sarea1 - small )
847 r_totalsarea1 = 1.0_rp / ( total_sarea1 + zerosw ) * ( 1.0_rp - zerosw )
848 zerosw = 0.5_rp - sign( 0.5_rp, total_sarea2 - small )
849 r_totalsarea2 = 1.0_rp / ( total_sarea2 + zerosw ) * ( 1.0_rp - zerosw )
851 diff_qcrg(:) = 0.0_rp
859 if ( flg_chrged(n) )
then
860 sw = 0.5_rp + sign( 0.5_rp, qtrc(k,i,j,n) )
862 + pos_crg * sarea(k,i,j,n) * r_totalsarea1 &
864 + neg_crg * sarea(k,i,j,n) * r_totalsarea2 &
866 qcrg_before(n) = qtrc(k,i,j,n)
868 if( sw == 1.0_rp )
then
869 qtrc(k,i,j,n) = max( qtrc(k,i,j,n) + dqneut(k,i,j,n), 0.0_rp )
870 elseif( sw == 0.0_rp )
then
871 qtrc(k,i,j,n) = min( qtrc(k,i,j,n) + dqneut(k,i,j,n), 0.0_rp )
875 diff_qcrg(int_sw) = diff_qcrg(int_sw) &
876 + ( qtrc(k,i,j,n) - qcrg_before(n) )
877 sum_crg(int_sw) = sum_crg(int_sw) + qtrc(k,i,j,n)
881 if( nutr_qhyd ==
'Each_POLARITY2' )
then
882 lack(0) = neg_crg - diff_qcrg(0)
883 lack(1) = pos_crg - diff_qcrg(1)
885 if( lack(0) > 0.0_rp .and. abs(lack(0)/diff_qcrg(0)) > 1.0e-10_rp )
then
886 log_info(
"ATMOS_PHY_LT_sato2019_adjustment",
'(A,4E15.7)') &
887 "Large negative for lack(0) ", lack(0)/diff_qcrg(0), neg_crg, lack(0), diff_qcrg(0)
889 if( lack(1) < 0.0_rp .and. abs(lack(1)/diff_qcrg(1)) > 1.0e-10_rp )
then
890 log_info(
"ATMOS_PHY_LT_sato2019_adjustment",
'(A,4E15.7)') &
891 "Large positive for lack(1) ", lack(1)/diff_qcrg(1), pos_crg, lack(1), diff_qcrg(1)
894 lack(0) = max( lack(0), 0.0_rp )
895 lack(1) = min( lack(1), 0.0_rp )
898 if ( flg_chrged(n) )
then
899 sw = 0.5_rp + sign( 0.5_rp, qtrc(k,i,j,n) )
901 if( sum_crg(int_sw) /= 0.0_rp )
then
902 crg_rate(n) = qtrc(k,i,j,n)/sum_crg(int_sw)
906 qtrc(k,i,j,n) = qtrc(k,i,j,n) + crg_rate(n) * lack(int_sw)
913 if ( flg_chrged(n) )
then
914 dqneut_real(k,i,j,n) = qtrc(k,i,j,n) - qcrg_before(n)
938 tmp_qcrg = tmp_qcrg + qtrc(k,i,j,n)
939 tmp_dqcrg = tmp_dqcrg + dqneut_real(k,i,j,n)
941 qcrg(k,i,j) = tmp_qcrg * dens(k,i,j) * 1.e-6_rp
942 dqneut_real_tot(k,i,j) = tmp_dqcrg
956 iprod = iprod + abs( qcrg(k,i,j) )
964 if( buf <= small )
then
973 efield(k,i,j,i_lt_x) = 0.0_rp
974 efield(k,i,j,i_lt_y) = 0.0_rp
975 efield(k,i,j,i_lt_z) = 0.0_rp
991 efield(:,:,:,i_lt_x:i_lt_z) )
1002 efield(k,i,j,i_lt_abs) = sqrt( efield(k,i,j,i_lt_x)*efield(k,i,j,i_lt_x) &
1003 + efield(k,i,j,i_lt_y)*efield(k,i,j,i_lt_y) &
1004 + efield(k,i,j,i_lt_z)*efield(k,i,j,i_lt_z) )
1011 if ( hist_id(i_qneut) > 0 )
then
1017 d_qcrg_tot(k,i,j) = d_qcrg_tot(k,i,j) + dqneut_real_tot(k,i,j)*1.e-6_rp
1023 if ( hist_id(i_flashpoint) > 0 )
then
1029 fls_int_p_tot(k,i,j) = fls_int_p_tot(k,i,j) + fls_int_p(k,i,j)
1036 if ( hist_id(i_posflash) > 0 )
then
1042 lt_path_tot(k,i,j,1) = lt_path_tot(k,i,j,1) &
1043 + 0.5_rp + sign( 0.5_rp,-dqneut_real_tot(k,i,j)-small )
1049 if ( hist_id(i_negflash) > 0 )
then
1055 lt_path_tot(k,i,j,2) = lt_path_tot(k,i,j,2) &
1056 + 0.5_rp + sign( 0.5_rp, dqneut_real_tot(k,i,j)-small )
1062 if ( hist_id(i_ltpath) > 0 )
then
1068 lt_path_tot(k,i,j,3) = lt_path_tot(k,i,j,3) + lt_path(k,i,j)
1074 if ( hist_id(i_fod) > 0 )
then
1078 b_f2013_tot(i,j) = b_f2013_tot(i,j) + g_f2013(i,j)/c_f2013*b_f2013(i,j)
1088 efield(:,:,:,i_lt_abs), &
1092 count_neut = count_neut + 1
1094 log_info(
"ATMOS_PHY_LT_sato2019_adjustment",
'(A,F15.7,A,F15.7,1X,I0)') &
1096 emax_old*1.e-3_rp,
' [kV/m] -> ', emax*1.e-3_rp, count_neut
1099 if( flg_lt_neut == 1 .and. emax == emax_old )
then
1102 log_info(
"ATMOS_PHY_LT_sato2019_adjustment",
'(A,2(E15.7,A),1X,I0)') &
1103 'Eabs value after neutralization is same as previous value, Finish', &
1104 emax_old*1.e-3_rp,
' [kV/m] -> ', emax*1.e-3_rp, count_neut
1106 elseif( flg_lt_neut == 1 .and. count_neut == max_nutr )
then
1109 log_info(
"ATMOS_PHY_LT_sato2019_adjustment",
'(2(E15.7,A),1X,I0)') &
1110 emax_old*1.e-3_rp,
' [kV/m] -> ', emax*1.e-3_rp, &
1111 ' [kV/m], reach maximum neutralization count, Finish', count_neut
1113 elseif( flg_lt_neut == 1 .and. emax > emax_old )
then
1116 log_info(
"ATMOS_PHY_LT_sato2019_adjustment",
'(2(E15.7,A),1X,I0)') &
1117 emax_old*1.e-3_rp,
' [kV/m] -> ', emax*1.e-3_rp, &
1118 ' [kV/m] larger than previous one by neutralization, back to previous step, Finish', &
1129 qtrc(k,i,j,n) = qtrc(k,i,j,n) - dqneut_real(k,i,j,n)
1131 d_qcrg_tot(k,i,j) = d_qcrg_tot(k,i,j) - dqneut_real_tot(k,i,j)*1.e-6_rp
1132 d_qcrg(k,i,j) = 0.0_rp
1137 elseif( flg_lt_neut == 2 )
then
1140 log_info(
"ATMOS_PHY_LT_sato2019_adjustment",
'(2(E15.7,A),1X,I0)') &
1141 emax_old*1.e-3_rp,
' [kV/m] -> ', emax*1.e-3_rp, &
1142 '[kV/m] After neutralization, Finish' , count_neut
1144 elseif( flg_lt_neut == 0 )
then
1146 log_info(
"ATMOS_PHY_LT_sato2019_adjustment",
'(2(F15.7,A),1X,I0)') &
1147 emax_old*1.e-3_rp,
' [kV/m] -> ', emax*1.e-3_rp, &
1148 '[kV/m] After neutralization, Finish', count_neut
1162 d_qcrg(k,i,j) = 0.0_rp
1172 call file_history_query( hist_id(ip), hist_sw(ip) )
1175 if ( hist_sw(i_ex ) )
then
1182 w3d(k,i,j) = efield(k,i,j,i_lt_x )*1.0e-3_rp
1187 call file_history_put( hist_id(i_ex ), w3d(:,:,:) )
1189 if ( hist_sw(i_ey ) )
then
1196 w3d(k,i,j) = efield(k,i,j,i_lt_y )*1.0e-3_rp
1201 call file_history_put( hist_id(i_ey ), w3d(:,:,:) )
1203 if ( hist_sw(i_ez ) )
then
1210 w3d(k,i,j) = efield(k,i,j,i_lt_z )*1.0e-3_rp
1215 call file_history_put( hist_id(i_ez ), w3d(:,:,:) )
1217 if ( hist_sw(i_eabs) )
then
1224 w3d(k,i,j) = efield(k,i,j,i_lt_abs)*1.0e-3_rp
1229 call file_history_put( hist_id(i_eabs), w3d(:,:,:) )
1231 if ( hist_sw(i_epot) )
then
1232 call file_history_put( hist_id(i_epot), epot(:,:,:) )
1234 if ( hist_sw(i_qneut) )
then
1240 w3d(k,i,j) = d_qcrg_tot(k,i,j)/dt_lt
1245 call file_history_put( hist_id(i_qneut), w3d(:,:,:) )
1247 if ( hist_sw(i_ltpath) )
then
1253 w3d(k,i,j) = lt_path_tot(k,i,j,3)/dt_lt
1258 call file_history_put( hist_id(i_ltpath), w3d(:,:,:) )
1260 if ( hist_sw(i_posflash) )
then
1266 w3d(k,i,j) = lt_path_tot(k,i,j,1)/dt_lt
1271 call file_history_put( hist_id(i_posflash), w3d(:,:,:) )
1273 if ( hist_sw(i_negflash) )
then
1279 w3d(k,i,j) = lt_path_tot(k,i,j,2)/dt_lt
1284 call file_history_put( hist_id(i_negflash), w3d(:,:,:) )
1286 if ( hist_sw(i_flashpoint) )
then
1292 w3d(k,i,j) = fls_int_p_tot(k,i,j)/dt_lt
1297 call file_history_put( hist_id(i_flashpoint), w3d(:,:,:) )
1299 if ( hist_sw(i_fod) )
then
1304 w3d(1,i,j) = b_f2013_tot(i,j)/dt_lt
1308 call file_history_put( hist_id(i_fod), w3d(1,:,:) )
1320 KA, KS, KE, & ! [IN]
1321 IA, IS, IE, & ! [IN]
1322 JA, JS, JE, & ! [IN]
1373 integer,
intent(in) :: KA, KS, KE
1374 integer,
intent(in) :: IA, IS, IE
1375 integer,
intent(in) :: JA, JS, JE
1376 real(RP),
intent(in) :: QCRG (KA,IA,JA)
1377 real(RP),
intent(in) :: DENS (KA,IA,JA)
1378 real(RP),
intent(in) :: RHOT (KA,IA,JA)
1379 real(RP),
intent(inout) :: E_pot (KA,IA,JA)
1380 real(RP),
intent(inout) :: Efield(KA,IA,JA,3)
1384 real(RP) :: B(KA,IA,JA)
1385 real(RP) :: E_pot_N(KA,IA,JA)
1387 integer :: i, j, k, ijk, ierror
1388 real(RP) :: iprod, buf
1404 e_pot_n(k,i,j) = e_pot(k,i,j)
1410 call comm_vars8( e_pot_n, 1 )
1418 eps_air = epsvac * epsair
1419 b(k,i,j) = - qcrg(k,i,j)/eps_air * 1.0e-9_rp
1425 call comm_wait ( e_pot_n, 1 )
1436 call comm_vars8( e_pot, 1 )
1437 call comm_wait ( e_pot, 1, .true. )
1445 e_pot(k,i,j) = 0.0_rp
1448 e_pot(k,i,j) = 0.0_rp
1460 efield(k,i,j,i_lt_x) = - mapf(i,j,1,
i_xyz)/gsqrt(k,i,j,
i_xyz) * &
1462 ( gsqrt(k,i+1,j,
i_xyz)*e_pot(k,i+1,j) - gsqrt(k,i-1,j,
i_xyz)*e_pot(k,i-1,j) ) &
1463 * rcdx(i) * 0.5_rp &
1464 + ( j13g(k+1,i,j,
i_xyz)*gsqrt(k+1,i,j,
i_xyz)*e_pot(k+1,i,j) &
1465 - j13g(k-1,i,j,
i_xyz)*gsqrt(k-1,i,j,
i_xyz)*e_pot(k-1,i,j) &
1467 * rfdz(k) * 0.5_rp &
1469 efield(k,i,j,i_lt_y) = - mapf(i,j,2,
i_xyz)/gsqrt(k,i,j,
i_xyz) * &
1471 ( gsqrt(k,i,j+1,
i_xyz)*e_pot(k,i,j+1) - gsqrt(k,i,j-1,
i_xyz)*e_pot(k,i,j-1) ) &
1472 * rcdy(j) * 0.5_rp &
1473 + ( j23g(k+1,i,j,
i_xyz)*gsqrt(k+1,i,j,
i_xyz)*e_pot(k+1,i,j) &
1474 - j23g(k-1,i,j,
i_xyz)*gsqrt(k-1,i,j,
i_xyz)*e_pot(k-1,i,j) &
1476 * rfdz(k) * 0.5_rp &
1478 efield(k,i,j,i_lt_z) = - 1.0_rp/gsqrt(k,i,j,
i_xyz) * &
1479 ( j33g*e_pot(k+1,i ,j )*gsqrt(k+1,i,j,
i_xyz) &
1480 - j33g*e_pot(k-1,i ,j )*gsqrt(k-1,i,j,
i_xyz) &
1496 KA, KS, KE, & ! [IN]
1497 IA, IS, IE, & ! [IN]
1498 JA, JS, JE, & ! [IN]
1511 integer,
intent(in) :: KA, KS, KE
1512 integer,
intent(in) :: IA, IS, IE
1513 integer,
intent(in) :: JA, JS, JE
1514 real(RP),
intent(out) :: PHI_N(KA,IA,JA)
1515 real(RP),
intent(in) :: PHI(KA,IA,JA)
1516 real(RP),
intent(in) :: M(KA,15,IA,JA)
1517 real(RP),
intent(in) :: B(KA,IA,JA)
1519 real(RP) :: r0(KA,IA,JA)
1521 real(RP) :: p(KA,IA,JA)
1522 real(RP) :: Mp(KA,IA,JA)
1523 real(RP) :: s(KA,IA,JA)
1524 real(RP) :: Ms(KA,IA,JA)
1525 real(RP) :: al, be, w
1527 real(RP),
pointer :: r(:,:,:), rn(:,:,:), swap(:,:,:)
1528 real(RP),
target :: rbuf1(KA,IA,JA)
1529 real(RP),
target :: rbuf2(KA,IA,JA)
1530 real(RP) :: v1(KA,IA,JA)
1533 real(RP) :: norm, error, error2
1535 real(RP) :: iprod1, iprod2
1538 real(RP):: diag(KA,IA,JA)
1539 real(RP):: z1(KA,IA,JA)
1540 real(RP):: z2(KA,IA,JA)
1541 real(RP):: Mz1(KA,IA,JA)
1542 real(RP):: Mz2(KA,IA,JA)
1545 integer :: iis, iie, jjs, jje
1557 if( flag_preprocessing == 3 )
then
1566 call mul_matrix( ka, ks, ke, &
1578 norm = norm + b(k,i,j)**2
1590 r(k,i,j) = b(k,i,j) - v1(k,i,j)
1601 r0(k,i,j) = r(k,i,j)
1615 r0r = r0r + r0(k,i,j) * r(k,i,j)
1626 phi_n(k,i,j) = phi(k,i,j)
1641 call comm_vars8( p, 1 )
1650 error = error + r(k,i,j)**2
1658 call comm_wait ( p, 1 )
1660 if ( sqrt(error/norm) < epsilon )
then
1661 log_info(
"ATMOS_PHY_LT_Efield",
'(a,1x,i0,1x,2e15.7)')
"Bi-CGSTAB converged:", iter, sqrt(error/norm),norm
1666 if( flag_preprocessing == 0 )
then
1668 call mul_matrix( ka, ks, ke, &
1680 iprod1 = iprod1 + r0(k,i,j) * mp(k,i,j)
1688 if( flag_preprocessing == 1 )
then
1690 call gs( ka, ks, ke, &
1695 elseif( flag_preprocessing == 2 )
then
1697 call sgs( ka, ks, ke, &
1702 elseif( flag_preprocessing == 3 )
then
1705 call solve_ilu( ka, ks, ke, &
1713 call comm_vars8( z1, 1 )
1715 call mul_matrix( ka, ks, ke, &
1720 call comm_wait ( z1, 1 )
1722 call mul_matrix( ka, ks, ke, &
1734 iprod1 = iprod1 + r0(k,i,j) * mz1(k,i,j)
1744 if ( iprod1 == 0.0_rp )
then
1745 log_info(
"ATMOS_PHY_LT_Efield",
'(a,1x,e15.7,1x,i10)')
'Iprod1 is zero(Bi-CGSTAB) skip:', iprod1, iter
1750 if( flag_preprocessing == 0 )
then
1756 s(k,i,j) = r(k,i,j) - al*mp(k,i,j)
1767 s(k,i,j) = r(k,i,j) - al*mz1(k,i,j)
1774 call comm_vars8( s, 1 )
1775 call comm_wait ( s, 1 )
1776 if( flag_preprocessing == 0 )
then
1778 call mul_matrix( ka, ks, ke, &
1791 iprod1 = iprod1 + ms(k,i,j) * s(k,i,j)
1792 iprod2 = iprod2 + ms(k,i,j) * ms(k,i,j)
1800 if( flag_preprocessing == 1 )
then
1802 call gs( ka, ks, ke, &
1807 elseif( flag_preprocessing == 2 )
then
1809 call sgs( ka, is, ke, &
1814 elseif( flag_preprocessing == 3 )
then
1817 call solve_ilu( ka, ks, ke, &
1824 call comm_vars8( z2, 1 )
1825 call comm_wait ( z2, 1 )
1826 call mul_matrix( ka, ks, ke, &
1839 iprod1 = iprod1 + mz2(k,i,j) * s(k,i,j)
1840 iprod2 = iprod2 + mz2(k,i,j) * mz2(k,i,j)
1852 if ( buf(2) == 0.0_rp )
then
1853 log_info(
"ATMOS_PHY_LT_Efield",
'(a,1x,e15.7,1x,i10)')
'Buf(2) is zero(Bi-CGSTAB) skip:', buf(2), iter
1858 if( flag_preprocessing == 0 )
then
1865 phi_n(k,i,j) = phi_n(k,i,j) + al*p(k,i,j) + w*s(k,i,j)
1876 rn(k,i,j) = s(k,i,j) - w*ms(k,i,j)
1889 phi_n(k,i,j) = phi_n(k,i,j) + al*z1(k,i,j) + w*z2(k,i,j)
1900 rn(k,i,j) = s(k,i,j) - w*mz2(k,i,j)
1915 iprod1 = iprod1 + r0(k,i,j) * rn(k,i,j)
1927 if( flag_preprocessing == 0 )
then
1933 p(k,i,j) = rn(k,i,j) + be * ( p(k,i,j) - w*mp(k,i,j) )
1944 p(k,i,j) = rn(k,i,j) + be * ( p(k,i,j) - w*mz1(k,i,j) )
1955 if ( r0r == 0.0_rp )
then
1956 log_info(
"ATMOS_PHY_LT_Efield",
'(a,1x,i0,1x,3e15.7)')
"Inner product of r0 and r_itr is zero(Bi-CGSTAB) :", &
1957 iter, r0r, sqrt(error/norm), norm
1963 if ( iter >= itmax )
then
1965 log_warn(
"ATMOS_PHY_LT_solve_bicgstab",
'(a,1x,2e15.7)')
'Bi-CGSTAB not converged:', error, norm
1966 log_warn_cont(
'(a,1x,2e15.7)')
'Bi-CGSTAB not converged:', epsilon, sqrt(error/norm)
1967 log_warn_cont(
'(a,1x,2e15.7)')
'xxx epsilon(set,last)=', epsilon, sqrt(error/norm)
1968 if( error /= error )
then
1969 log_error(
"ATMOS_PHY_LT_solve_bicgstab",*)
'xxx error or norm is NaN Stop!'
1985 integer,
intent(in) :: KA, KS, KE
1986 integer,
intent(in) :: IA, IS, IE
1987 integer,
intent(in) :: JA, JS, JE
1988 real(RP),
intent(in) :: M(KA,15,IA,JA)
1989 real(RP),
intent(out) :: diag(KA,IA,JA)
1997 diag(k,i,j)=m(k,1,i,j)
2007 diag(k+1,i,j) = diag(k+1,i,j) + m(k,3,i,j)*m(k+1,2,i,j)/diag(k,i,j)
2009 diag(k+1,i+1,j) = diag(k+1,i+1,j) + m(k,13,i,j)*m(k+1,8,i+1,j)/diag(k,i,j)
2012 diag(k+1,i,j+1) = diag(k+1,i,j+1) + m(k,15,i,j)*m(k+1,10,i,j+1)/diag(k,i,j)
2016 diag(k,i+1,j) = diag(k,i+1,j) +m(k,5,i,j)*m(k,4,i+1,j)/diag(k,i,j)
2018 diag(k-1,i+1,j) = diag(k-1,i+1,j) + m(k,9,i,j)*m(k-1,12,i+1,j)/diag(k,i,j)
2022 diag(k,i,j+1)=diag(k,i,j+1) + m(k,7,i,j)*m(k,6,i,j+1)/diag(k,i,j)
2024 diag(k-1,i,j+1) = diag(k-1,i,j+1) + m(k,11,i,j)*m(k-1,14,i,j+1)/diag(k,i,j)
2035 subroutine solve_ilu( KA,KS,KE, &
2043 integer,
intent(in) :: KA, KS, KE
2044 integer,
intent(in) :: IA, IS, IE
2045 integer,
intent(in) :: JA, JS, JE
2046 real(RP),
intent(in) :: M(KA,15,IA,JA)
2047 real(RP),
intent(in) :: diag(KA,IA,JA)
2048 real(RP),
intent(in) :: V(KA,IA,JA)
2049 real(RP),
intent(out) :: Z(KA,IA,JA)
2051 real(RP):: Y(KA,IA,JA)
2054 call gs_ilu(ka, ks, ke, &
2063 y(k,i,j)=diag(k,i,j)*y(k,i,j)
2075 end subroutine solve_ilu
2086 integer,
intent(in) :: KA, KS, KE
2087 integer,
intent(in) :: IA, IS, IE
2088 integer,
intent(in) :: JA, JS, JE
2089 real(RP),
intent(in) :: V(KA,IA,JA)
2090 real(RP),
intent(in) :: M(KA,15,IA,JA)
2091 real(RP),
intent(in) :: diag(KA,IA,JA)
2092 real(RP),
intent(out) :: Z(KA,IA,JA)
2101 z(ke,i,j) = ( v(ke,i,j) &
2102 -( m(ke,2,i,j) * z(ke-1,i ,j ) &
2103 + m(ke,4,i,j) * z(ke ,i-1,j ) &
2104 + m(ke,5,i,j) * z(ke ,i+1,j ) &
2105 + m(ke,6,i,j) * z(ke ,i ,j-1) &
2106 + m(ke,7,i,j) * z(ke ,i ,j+1) &
2107 + m(ke,8,i,j) * z(ke-1,i-1,j ) &
2108 + m(ke,9,i,j) * z(ke-1,i+1,j ) &
2109 + m(ke,10,i,j)* z(ke-1,i ,j-1) &
2110 + m(ke,11,i,j)* z(ke-1,i ,j+1) ) )/diag(ke,i,j)
2112 do k = ke-1, ks+1,-1
2113 z(k,i,j) = (v(k,i,j) &
2114 -( m(k,2,i,j) * z(k-1,i ,j ) &
2115 + m(k,3,i,j) * z(k+1,i ,j ) &
2116 + m(k,4,i,j) * z(k ,i-1,j ) &
2117 + m(k,5,i,j) * z(k ,i+1,j ) &
2118 + m(k,6,i,j) * z(k ,i ,j-1) &
2119 + m(k,7,i,j) * z(k ,i ,j+1) &
2120 + m(k,8,i,j) * z(k-1,i-1,j ) &
2121 + m(k,9,i,j) * z(k-1,i+1,j ) &
2122 + m(k,10,i,j)* z(k-1,i ,j-1) &
2123 + m(k,11,i,j)* z(k-1,i ,j+1) &
2124 + m(k,12,i,j)* z(k+1,i-1,j ) &
2125 + m(k,13,i,j)* z(k+1,i+1,j ) &
2126 + m(k,14,i,j)* z(k+1,i ,j-1) &
2127 + m(k,15,i,j)* z(k+1,i ,j+1) ) )/diag(k,i,j)
2130 z(ks,i,j) = (v(ks,i,j) &
2131 -( m(ks,3,i,j) * z(ks+1,i ,j ) &
2132 + m(ks,4,i,j) * z(ks ,i-1,j ) &
2133 + m(ks,5,i,j) * z(ks ,i+1,j ) &
2134 + m(ks,6,i,j) * z(ks ,i ,j-1) &
2135 + m(ks,7,i,j) * z(ks ,i ,j+1) &
2136 + m(ks,12,i,j)* z(ks+1,i-1,j ) &
2137 + m(ks,13,i,j)* z(ks+1,i+1,j ) &
2138 + m(ks,14,i,j)* z(ks+1,i ,j-1) &
2139 + m(ks,15,i,j)* z(ks+1,i ,j+1) ) ) /diag(ks,i,j)
2154 integer,
intent(in) :: KA, KS, KE
2155 integer,
intent(in) :: IA, IS, IE
2156 integer,
intent(in) :: JA, JS, JE
2157 real(RP),
intent(in) :: V(KA,IA,JA)
2158 real(RP),
intent(in) :: M(KA,15,IA,JA)
2159 real(RP),
intent(in) :: diag(KA,IA,JA)
2160 real(RP),
intent(out) :: Z(KA,IA,JA)
2169 z(ks,i,j) = (v(ks,i,j) &
2170 -( m(ks,3,i,j) * z(ks+1,i ,j ) &
2171 + m(ks,4,i,j) * z(ks ,i-1,j ) &
2172 + m(ks,5,i,j) * z(ks ,i+1,j ) &
2173 + m(ks,6,i,j) * z(ks ,i ,j-1) &
2174 + m(ks,7,i,j) * z(ks ,i ,j+1) &
2175 + m(ks,12,i,j)* z(ks+1,i-1,j ) &
2176 + m(ks,13,i,j)* z(ks+1,i+1,j ) &
2177 + m(ks,14,i,j)* z(ks+1,i ,j-1) &
2178 + m(ks,15,i,j)* z(ks+1,i ,j+1) ) ) /diag(ks,i,j)
2181 z(k,i,j) = (v(k,i,j) &
2182 -( m(k,2,i,j) * z(k-1,i ,j ) &
2183 + m(k,3,i,j) * z(k+1,i ,j ) &
2184 + m(k,4,i,j) * z(k ,i-1,j ) &
2185 + m(k,5,i,j) * z(k ,i+1,j ) &
2186 + m(k,6,i,j) * z(k ,i ,j-1) &
2187 + m(k,7,i,j) * z(k ,i ,j+1) &
2188 + m(k,8,i,j) * z(k-1,i-1,j ) &
2189 + m(k,9,i,j) * z(k-1,i+1,j ) &
2190 + m(k,10,i,j)* z(k-1,i ,j-1) &
2191 + m(k,11,i,j)* z(k-1,i ,j+1) &
2192 + m(k,12,i,j)* z(k+1,i-1,j ) &
2193 + m(k,13,i,j)* z(k+1,i+1,j ) &
2194 + m(k,14,i,j)* z(k+1,i ,j-1) &
2195 + m(k,15,i,j)* z(k+1,i ,j+1) ) )/diag(k,i,j)
2198 z(ke,i,j) = ( v(ke,i,j) &
2199 -( m(ke,2,i,j) * z(ke-1,i ,j ) &
2200 + m(ke,4,i,j) * z(ke ,i-1,j ) &
2201 + m(ke,5,i,j) * z(ke ,i+1,j ) &
2202 + m(ke,6,i,j) * z(ke ,i ,j-1) &
2203 + m(ke,7,i,j) * z(ke ,i ,j+1) &
2204 + m(ke,8,i,j) * z(ke-1,i-1,j ) &
2205 + m(ke,9,i,j) * z(ke-1,i+1,j ) &
2206 + m(ke,10,i,j)* z(ke-1,i ,j-1) &
2207 + m(ke,11,i,j)* z(ke-1,i ,j+1) ) )/diag(ke,i,j)
2216 subroutine sgs( KA, KS, KE, &
2221 integer,
intent(in) :: KA, KS, KE
2222 integer,
intent(in) :: IA, IS, IE
2223 integer,
intent(in) :: JA, JS, JE
2224 real(RP),
intent(in) :: M(KA,15,IA,JA)
2225 real(RP),
intent(in) :: V(KA,IA,JA)
2226 real(RP),
intent(out) :: Z(KA,IA,JA)
2227 real(RP):: Y(KA,IA,JA)
2232 call gs( ka, ks, ke, &
2242 y(k,i,j)=m(k,1,i,j)*y(k,i,j)
2248 call back_sub(ka, ks, ke, &
2259 subroutine back_sub ( KA, KS, KE, &
2264 integer,
intent(in) :: KA, KS, KE
2265 integer,
intent(in) :: IA, IS, IE
2266 integer,
intent(in) :: JA, JS, JE
2267 real(RP),
intent(in) :: V(KA,IA,JA)
2268 real(RP),
intent(in) :: M(KA,15,IA,JA)
2269 real(RP),
intent(out) :: Z(KA,IA,JA)
2283 z(k,i,js-1) = 0.0_rp
2284 z(k,i,je+1) = 0.0_rp
2292 z(k,is-1,j) = 0.0_rp
2293 z(k,ie+1,j) = 0.0_rp
2307 if ( mod((ie-i)+(je-j),2)==0 )
then
2309 z(ke,i,j) = ( v(ke,i,j) )/m(ke,1,i,j)
2312 z(k,i,j) = (v(k,i,j) &
2313 -( m(k,3,i,j) * z(k+1,i ,j ) ) )/m(k,1,i,j)
2325 z(ke,i,j) = ( v(ke,i,j) &
2326 -( m(ke,5,i,j) * z(ke ,i+1,j ) ) )/m(ke,1,i,j)
2329 z(k,i,j) = (v(k,i,j) &
2330 -( m(k,3,i,j) * z(k+1,i ,j ) &
2331 + m(k,5,i,j) * z(k ,i+1,j ) &
2332 + m(k,13,i,j)* z(k+1,i+1,j ) ) )/m(k,1,i,j)
2341 z(ke,i,j) = ( v(ke,i,j) &
2342 -( m(ke,5,i,j) * z(ke ,i+1,j ) &
2343 + m(ke,7,i,j) * z(ke ,i ,j+1) ) )/m(ke,1,i,j)
2346 z(k,i,j) = (v(k,i,j) &
2347 -( m(k,3,i,j) * z(k+1,i ,j ) &
2348 + m(k,5,i,j) * z(k ,i+1,j ) &
2349 + m(k,7,i,j) * z(k ,i ,j+1) &
2350 + m(k,13,i,j)* z(k+1,i+1,j ) &
2351 + m(k,15,i,j)* z(k+1,i ,j+1) ) )/m(k,1,i,j)
2366 if ( mod((ie-i)+(je-j),2)==1 )
then
2368 z(ke,i,j) = ( v(ke,i,j) &
2369 -( m(ke,4,i,j) * z(ke ,i-1,j ) &
2370 + m(ke,5,i,j) * z(ke ,i+1,j ) &
2371 + m(ke,6,i,j) * z(ke ,i ,j-1) &
2372 + m(ke,7,i,j) * z(ke ,i ,j+1) &
2373 + m(ke,8,i,j) * z(ke-1,i-1,j ) &
2374 + m(ke,9,i,j) * z(ke-1,i+1,j ) &
2375 + m(ke,10,i,j)* z(ke-1,i ,j-1) &
2376 + m(ke,11,i,j)* z(ke-1,i ,j+1) ) )/m(ke,1,i,j)
2378 do k = ke-1, ks+1,-1
2379 z(k,i,j) = (v(k,i,j) &
2380 -( m(k,3,i,j) * z(k+1,i ,j ) &
2381 + m(k,4,i,j) * z(k ,i-1,j ) &
2382 + m(k,5,i,j) * z(k ,i+1,j ) &
2383 + m(k,6,i,j) * z(k ,i ,j-1) &
2384 + m(k,7,i,j) * z(k ,i ,j+1) &
2385 + m(k,8,i,j) * z(k-1,i-1,j ) &
2386 + m(k,9,i,j) * z(k-1,i+1,j ) &
2387 + m(k,10,i,j)* z(k-1,i ,j-1) &
2388 + m(k,11,i,j)* z(k-1,i ,j+1) &
2389 + m(k,12,i,j)* z(k+1,i-1,j ) &
2390 + m(k,13,i,j)* z(k+1,i+1,j ) &
2391 + m(k,14,i,j)* z(k+1,i ,j-1) &
2392 + m(k,15,i,j)* z(k+1,i ,j+1) ) )/m(k,1,i,j)
2395 z(ks,i,j) = (v(ks,i,j) &
2396 -( m(ks,3,i,j) * z(ks+1,i ,j ) &
2397 + m(ks,4,i,j) * z(ks ,i-1,j ) &
2398 + m(ks,5,i,j) * z(ks ,i+1,j ) &
2399 + m(ks,6,i,j) * z(ks ,i ,j-1) &
2400 + m(ks,7,i,j) * z(ks ,i ,j+1) &
2401 + m(ks,12,i,j)* z(ks+1,i-1,j ) &
2402 + m(ks,13,i,j)* z(ks+1,i+1,j ) &
2403 + m(ks,14,i,j)* z(ks+1,i ,j-1) &
2404 + m(ks,15,i,j)* z(ks+1,i ,j+1) ) ) /m(ks,1,i,j)
2413 z(ke,i,j) = ( v(ke,i,j) &
2414 -( m(ke,5,i,j) * z(ke ,i+1,j ) &
2415 + m(ke,6,i,j) * z(ke ,i ,j-1) &
2416 + m(ke,7,i,j) * z(ke ,i ,j+1) &
2417 + m(ke,9,i,j) * z(ke-1,i+1,j ) &
2418 + m(ke,10,i,j)* z(ke-1,i ,j-1) &
2419 + m(ke,11,i,j)* z(ke-1,i ,j+1) ) )/m(ke,1,i,j)
2421 do k = ke-1, ks+1,-1
2422 z(k,i,j) = (v(k,i,j) &
2423 -( m(k,3,i,j) * z(k+1,i ,j ) &
2424 + m(k,5,i,j) * z(k ,i+1,j ) &
2425 + m(k,6,i,j) * z(k ,i ,j-1) &
2426 + m(k,7,i,j) * z(k ,i ,j+1) &
2427 + m(k,9,i,j) * z(k-1,i+1,j ) &
2428 + m(k,10,i,j)* z(k-1,i ,j-1) &
2429 + m(k,11,i,j)* z(k-1,i ,j+1) &
2430 + m(k,13,i,j)* z(k+1,i+1,j ) &
2431 + m(k,14,i,j)* z(k+1,i ,j-1) &
2432 + m(k,15,i,j)* z(k+1,i ,j+1) ) )/m(k,1,i,j)
2435 z(ks,i,j) = (v(ks,i,j) &
2436 -( m(ks,3,i,j) * z(ks+1,i ,j ) &
2437 + m(ks,5,i,j) * z(ks ,i+1,j ) &
2438 + m(ks,6,i,j) * z(ks ,i ,j-1) &
2439 + m(ks,7,i,j) * z(ks ,i ,j+1) &
2440 + m(ks,13,i,j)* z(ks+1,i+1,j ) &
2441 + m(ks,14,i,j)* z(ks+1,i ,j-1) &
2442 + m(ks,15,i,j)* z(ks+1,i ,j+1) ) ) /m(ks,1,i,j)
2452 end subroutine back_sub
2455 subroutine gs ( KA, KS, KE, &
2460 integer,
intent(in) :: KA, KS, KE
2461 integer,
intent(in) :: IA, IS, IE
2462 integer,
intent(in) :: JA, JS, JE
2463 real(RP),
intent(in) :: V(KA,IA,JA)
2464 real(RP),
intent(in) :: M(KA,15,IA,JA)
2465 real(RP),
intent(out) :: Z(KA,IA,JA)
2467 integer :: k, i, j, n
2476 z(k,i,js-1) = 0.0_rp
2477 z(k,i,je+1) = 0.0_rp
2485 z(k,is-1,j) = 0.0_rp
2486 z(k,ie+1,j) = 0.0_rp
2500 if ( mod((i-is)+(j-js),2)==0 )
then
2502 z(ks,i,j) = (v(ks,i,j) ) /m(ks,1,i,j)
2505 z(k,i,j) = (v(k,i,j) &
2506 -( m(k,2,i,j) * z(k-1,i ,j ) ) )/m(k,1,i,j)
2518 z(ks,i,j) = (v(ks,i,j) &
2519 -( m(ks,4,i,j) * z(ks ,i-1,j ) ) ) /m(ks,1,i,j)
2522 z(k,i,j) = (v(k,i,j) &
2523 -( m(k,2,i,j) * z(k-1,i ,j ) &
2524 + m(k,4,i,j) * z(k ,i-1,j ) &
2525 + m(k,8,i,j) * z(k-1,i-1,j ) ) )/m(k,1,i,j)
2534 z(ks,i,j) = (v(ks,i,j) &
2535 -( m(ks,4,i,j) * z(ks ,i-1,j ) &
2536 + m(ks,6,i,j) * z(ks ,i ,j-1) ) ) /m(ks,1,i,j)
2539 z(k,i,j) = (v(k,i,j) &
2540 -( m(k,2,i,j) * z(k-1,i ,j ) &
2541 + m(k,4,i,j) * z(k ,i-1,j ) &
2542 + m(k,6,i,j) * z(k ,i ,j-1) &
2543 + m(k,8,i,j) * z(k-1,i-1,j ) &
2544 + m(k,10,i,j)* z(k-1,i ,j-1) ) )/m(k,1,i,j)
2559 if ( mod((i-is)+(j-js),2)==1 )
then
2561 z(ks,i,j) = (v(ks,i,j) &
2562 -( m(ks,4,i,j) * z(ks ,i-1,j ) &
2563 + m(ks,5,i,j) * z(ks ,i+1,j ) &
2564 + m(ks,6,i,j) * z(ks ,i ,j-1) &
2565 + m(ks,7,i,j) * z(ks ,i ,j+1) &
2566 + m(ks,12,i,j)* z(ks+1,i-1,j ) &
2567 + m(ks,13,i,j)* z(ks+1,i+1,j ) &
2568 + m(ks,14,i,j)* z(ks+1,i ,j-1) &
2569 + m(ks,15,i,j)* z(ks+1,i ,j+1) ) ) /m(ks,1,i,j)
2572 z(k,i,j) = (v(k,i,j) &
2573 -( m(k,2,i,j) * z(k-1,i ,j ) &
2574 + m(k,4,i,j) * z(k ,i-1,j ) &
2575 + m(k,5,i,j) * z(k ,i+1,j ) &
2576 + m(k,6,i,j) * z(k ,i ,j-1) &
2577 + m(k,7,i,j) * z(k ,i ,j+1) &
2578 + m(k,8,i,j) * z(k-1,i-1,j ) &
2579 + m(k,9,i,j) * z(k-1,i+1,j ) &
2580 + m(k,10,i,j)* z(k-1,i ,j-1) &
2581 + m(k,11,i,j)* z(k-1,i ,j+1) &
2582 + m(k,12,i,j)* z(k+1,i-1,j ) &
2583 + m(k,13,i,j)* z(k+1,i+1,j ) &
2584 + m(k,14,i,j)* z(k+1,i ,j-1) &
2585 + m(k,15,i,j)* z(k+1,i ,j+1) ) )/m(k,1,i,j)
2588 z(ke,i,j) = ( v(ke,i,j) &
2589 -( m(ke,2,i,j) * z(ke-1,i ,j ) &
2590 + m(ke,4,i,j) * z(ke ,i-1,j ) &
2591 + m(ke,5,i,j) * z(ke ,i+1,j ) &
2592 + m(ke,6,i,j) * z(ke ,i ,j-1) &
2593 + m(ke,7,i,j) * z(ke ,i ,j+1) &
2594 + m(ke,8,i,j) * z(ke-1,i-1,j ) &
2595 + m(ke,9,i,j) * z(ke-1,i+1,j ) &
2596 + m(ke,10,i,j)* z(ke-1,i ,j-1) &
2597 + m(ke,11,i,j)* z(ke-1,i ,j+1) ) )/m(ke,1,i,j)
2606 z(ks,i,j) = (v(ks,i,j) &
2607 -( m(ks,4,i,j) * z(ks ,i-1,j ) &
2608 + m(ks,6,i,j) * z(ks ,i ,j-1) &
2609 + m(ks,7,i,j) * z(ks ,i ,j+1) &
2610 + m(ks,12,i,j)* z(ks+1,i-1,j ) &
2611 + m(ks,14,i,j)* z(ks+1,i ,j-1) &
2612 + m(ks,15,i,j)* z(ks+1,i ,j+1) ) ) /m(ks,1,i,j)
2615 z(k,i,j) = (v(k,i,j) &
2616 -( m(k,2,i,j) * z(k-1,i ,j ) &
2617 + m(k,4,i,j) * z(k ,i-1,j ) &
2618 + m(k,6,i,j) * z(k ,i ,j-1) &
2619 + m(k,7,i,j) * z(k ,i ,j+1) &
2620 + m(k,8,i,j) * z(k-1,i-1,j ) &
2621 + m(k,10,i,j)* z(k-1,i ,j-1) &
2622 + m(k,11,i,j)* z(k-1,i ,j+1) &
2623 + m(k,12,i,j)* z(k+1,i-1,j ) &
2624 + m(k,14,i,j)* z(k+1,i ,j-1) &
2625 + m(k,15,i,j)* z(k+1,i ,j+1) ) )/m(k,1,i,j)
2628 z(ke,i,j) = ( v(ke,i,j) &
2629 -( m(ke,2,i,j) * z(ke-1,i ,j ) &
2630 + m(ke,4,i,j) * z(ke ,i-1,j ) &
2631 + m(ke,6,i,j) * z(ke ,i ,j-1) &
2632 + m(ke,7,i,j) * z(ke ,i ,j+1) &
2633 + m(ke,8,i,j) * z(ke-1,i-1,j ) &
2634 + m(ke,10,i,j)* z(ke-1,i ,j-1) &
2635 + m(ke,11,i,j)* z(ke-1,i ,j+1) ) )/m(ke,1,i,j)
2647 subroutine mul_matrix( KA,KS,KE, &
2652 integer,
intent(in) :: KA, KS, KE
2653 integer,
intent(in) :: IA, IS, IE
2654 integer,
intent(in) :: JA, JS, JE
2655 real(RP),
intent(out) :: V(KA,IA,JA)
2656 real(RP),
intent(in) :: M(KA,15,IA,JA)
2657 real(RP),
intent(in) :: C(KA,IA,JA)
2665 v(ks,i,j) = m(ks,1,i,j) * c(ks ,i ,j ) &
2666 + m(ks,3,i,j) * c(ks+1,i ,j ) &
2667 + m(ks,4,i,j) * c(ks ,i-1,j ) &
2668 + m(ks,5,i,j) * c(ks ,i+1,j ) &
2669 + m(ks,6,i,j) * c(ks ,i ,j-1) &
2670 + m(ks,7,i,j) * c(ks ,i ,j+1) &
2671 + m(ks,12,i,j)* c(ks+1,i-1,j ) &
2672 + m(ks,13,i,j)* c(ks+1,i+1,j ) &
2673 + m(ks,14,i,j)* c(ks+1,i ,j-1) &
2674 + m(ks,15,i,j)* c(ks+1,i ,j+1)
2676 v(k,i,j) = m(k,1,i,j) * c(k ,i ,j ) &
2677 + m(k,2,i,j) * c(k-1,i ,j ) &
2678 + m(k,3,i,j) * c(k+1,i ,j ) &
2679 + m(k,4,i,j) * c(k ,i-1,j ) &
2680 + m(k,5,i,j) * c(k ,i+1,j ) &
2681 + m(k,6,i,j) * c(k ,i ,j-1) &
2682 + m(k,7,i,j) * c(k ,i ,j+1) &
2683 + m(k,8,i,j) * c(k-1,i-1,j ) &
2684 + m(k,9,i,j) * c(k-1,i+1,j ) &
2685 + m(k,10,i,j)* c(k-1,i ,j-1) &
2686 + m(k,11,i,j)* c(k-1,i ,j+1) &
2687 + m(k,12,i,j)* c(k+1,i-1,j ) &
2688 + m(k,13,i,j)* c(k+1,i+1,j ) &
2689 + m(k,14,i,j)* c(k+1,i ,j-1) &
2690 + m(k,15,i,j)* c(k+1,i ,j+1)
2692 v(ke,i,j) = m(ke,1,i,j) * c(ke ,i ,j ) &
2693 + m(ke,2,i,j) * c(ke-1,i ,j ) &
2694 + m(ke,4,i,j) * c(ke ,i-1,j ) &
2695 + m(ke,5,i,j) * c(ke ,i+1,j ) &
2696 + m(ke,6,i,j) * c(ke ,i ,j-1) &
2697 + m(ke,7,i,j) * c(ke ,i ,j+1) &
2698 + m(ke,8,i,j) * c(ke-1,i-1,j ) &
2699 + m(ke,9,i,j) * c(ke-1,i+1,j ) &
2700 + m(ke,10,i,j)* c(ke-1,i ,j-1) &
2701 + m(ke,11,i,j)* c(ke-1,i ,j+1)
2707 end subroutine mul_matrix
2710 function f2h( k,i,j,p )
2722 integer,
intent(in) :: k, i, j, p
2724 f2h = (cdz(k+p-1)*gsqrt(k+p-1,i,j,
i_xyz) &
2725 / (cdz(k)*gsqrt(k,i,j,
i_xyz)+cdz(k+1)*gsqrt(k+1,i,j,
i_xyz)))
2732 KA, KS, KE, & ! [IN]
2733 IA, IS, IE, & ! [IN]
2734 JA, JS, JE, & ! [IN]
2743 NUM_end, & ! [INOUT]
2744 LT_path, & ! [INOUT]
2745 fls_int_p, & ! [OUT]
2795 integer,
intent(in) :: KA, KS, KE
2796 integer,
intent(in) :: IA, IS, IE
2797 integer,
intent(in) :: JA, JS, JE
2798 integer,
intent(in) :: KIJMAX, IMAX, JMAX
2799 real(RP),
intent(in) :: Efield (KA,IA,JA,4)
2800 real(RP),
intent(in) :: E_pot (KA,IA,JA)
2801 real(RP),
intent(in) :: QCRG (KA,IA,JA)
2802 real(RP),
intent(in) :: DENS (KA,IA,JA)
2803 real(RP),
intent(in) :: QHYD (KA,IA,JA)
2804 real(RP),
intent(inout) :: NUM_end (KA,IA,JA,3)
2805 real(RP),
intent(inout) :: LT_path (KA,IA,JA)
2806 real(RP),
intent(out) :: fls_int_p(KA,IA,JA)
2807 real(RP),
intent(out) :: d_QCRG (KA,IA,JA)
2809 real(RP) :: E_det, E_x, E_y, E_z, E_max
2810 real(RP) :: dqrho_pls(KA,IA,JA), dqrho_mns(KA,IA,JA)
2811 real(RP) :: L_path(KA,IA,JA)
2812 real(RP) :: sumdqrho_pls, sumdqrho_mns
2813 real(RP) :: Ncrit, dqrho_cor
2814 real(RP) :: randnum(1)
2815 real(RP) :: rprod1, rprod2, rbuf, rbuf2, phi_end(2)
2816 integer :: Eovid(4,KIJMAX)
2817 integer :: Npls, Nmns, Ntot
2818 integer :: count1(PRC_nprocs)
2819 integer :: countindx(PRC_nprocs+1)
2820 integer :: own_prc_total
2821 integer :: iprod(2), ibuf(6), status(MPI_STATUS_SIZE)
2822 integer :: init_point, rank_initpoint, grid_initpoint
2823 integer :: current_prc
2824 integer :: comm_flag, comm_target, stop_flag, corr_flag(2)
2825 integer :: end_grid(4), wild_grid(6)
2827 integer :: k, i, j, ipp, iq, direction, ierr
2828 integer :: k1, i1, j1, k2, i2, j2, sign_flash
2829 integer :: wild_flag, count_path
2830 integer :: flg_num_end(KA,IA,JA,3)
2831 real(RP) :: Eint_hgt(KA,IA,JA)
2839 fls_int_p(k,i,j) = 0.0_rp
2844 do count_path = 1, nutr_itmax
2852 eint_hgt(k,i,j) = min( eint*dens(k,i,j)/rho0,eint )*flg_eint_hgt &
2853 + ( eint-deleint )*( 1.0_rp-flg_eint_hgt )
2854 if( flg_eint_hgt == 1.0_rp .and. eint_hgt(k,i,j) < estop )
then
2855 eint_hgt(k,i,j) = large_num
2857 e_det = efield(k,i,j,i_lt_abs) - eint_hgt(k,i,j)
2858 if( e_det > 0.0_rp )
then
2859 own_prc_total = own_prc_total + 1
2860 eovid(1,own_prc_total) = i
2861 eovid(2,own_prc_total) = j
2862 eovid(3,own_prc_total) = k
2869 call mpi_allgather( own_prc_total, 1, mpi_integer, &
2870 count1, 1, mpi_integer, &
2875 do ipp = 1, prc_nprocs
2876 countindx(ipp+1) = countindx(ipp) + count1(ipp)
2883 call random_uniform(randnum)
2884 init_point = int( randnum(1) * countindx(prc_nprocs+1) ) + 1
2885 do ipp = 1, prc_nprocs
2886 if ( countindx(ipp+1) >= init_point )
then
2887 rank_initpoint = ipp-1
2891 grid_initpoint = init_point - countindx(rank_initpoint+1)
2892 ibuf(1) = rank_initpoint
2893 ibuf(2) = grid_initpoint
2896 call comm_bcast( 2, ibuf )
2898 rank_initpoint = ibuf(1)
2899 grid_initpoint = ibuf(2)
2908 l_path(k,i,j) = 0.0_rp
2909 flg_num_end(k,i,j,:) = 0
2919 elseif( iq == 2 )
then
2923 current_prc = rank_initpoint
2927 i = eovid(1,grid_initpoint)
2928 j = eovid(2,grid_initpoint)
2929 k = eovid(3,grid_initpoint)
2931 if( iq == 1 ) fls_int_p(k,i,j) = fls_int_p(k,i,j) + 1.0_rp
2932 sign_flash = 2 + int( sign( 1.0_rp, qcrg(k,i,j) ) )
2939 loop_path :
do ipp = 1, kijmaxg
2945 e_x = abs( efield(k,i,j,i_lt_x) )/cdx(i)
2946 e_y = abs( efield(k,i,j,i_lt_y) )/cdy(j)
2947 e_z = abs( efield(k,i,j,i_lt_z) )/cdz(k)
2948 e_det = max( e_x,e_y,e_z )
2953 if( e_det == e_x )
then
2954 direction = int( sign( 1.0_rp,efield(k,i,j,i_lt_x) ) * pm )
2956 elseif( e_det == e_y )
then
2957 direction = int( sign( 1.0_rp,efield(k,i,j,i_lt_y) ) * pm )
2959 elseif( e_det == e_z )
then
2960 direction = int( sign( 1.0_rp,efield(k,i,j,i_lt_z) ) * pm )
2965 if( efield(k1,i1,j1,i_lt_abs) <= estop )
then
2967 phi_end(iq) = qcrg(k,i,j)
2969 num_end(k,i,j,sign_flash) = num_end(k,i,j,sign_flash) + 1.0_rp
2970 flg_num_end(k,i,j,sign_flash) = 1
2977 if( qhyd(k,i,j) < eps )
then
2982 elseif( efield(k1,i1,j1,i_lt_abs) > estop )
then
2984 l_path(k, i ,j ) = pm
2985 l_path(k1,i1,j1) = pm
2991 num_end(k,i,j,sign_flash) = num_end(k,i,j,sign_flash) + 1.0_rp
2992 flg_num_end(k,i,j,sign_flash) = 1
2999 if( qhyd(k,i,j) < eps )
then
3004 elseif( cz(k1) < zcg )
then
3006 num_end(k,i,j,2) = num_end(k,i,j,2) + 1.0_rp
3007 flg_num_end(k,i,j,2) = 1
3014 if( qhyd(k,i,j) < eps )
then
3021 if( stop_flag /= 1 )
then
3023 if( i1 == is-1 .and. .not.
prc_has_w )
then
3025 num_end(k,i,j,sign_flash) = num_end(k,i,j,sign_flash) + 1.0_rp
3026 flg_num_end(k,i,j,sign_flash) = 1
3028 l_path(k1,i1,j1) = pm
3034 if( qhyd(k,i,j) < eps )
then
3039 elseif( i1 == is-1 .and.
prc_has_w )
then
3042 l_path(k1,i1,j1) = pm
3046 elseif( i1 == ie+1 .and. .not.
prc_has_e )
then
3048 num_end(k,i,j,sign_flash) = num_end(k,i,j,sign_flash) + 1.0_rp
3049 flg_num_end(k,i,j,sign_flash) = 1
3051 l_path(k1,i1,j1) = pm
3057 if( qhyd(k,i,j) < eps )
then
3062 elseif( i1 == ie+1 .and.
prc_has_e )
then
3065 l_path(k1,i1,j1) = pm
3072 if( j1 == js-1 .and. .not.
prc_has_s )
then
3074 num_end(k,i,j,sign_flash) = num_end(k,i,j,sign_flash) + 1.0_rp
3075 flg_num_end(k,i,j,sign_flash) = 1
3077 l_path(k1,i1,j1) = pm
3083 if( qhyd(k,i,j) < eps )
then
3088 elseif( j1 == js-1 .and.
prc_has_s )
then
3091 l_path(k1,i1,j1) = pm
3095 elseif( j1 == je+1 .and. .not.
prc_has_n )
then
3097 num_end(k,i,j,sign_flash) = num_end(k,i,j,sign_flash) + 1.0_rp
3098 flg_num_end(k,i,j,sign_flash) = 1
3100 l_path(k1,i1,j1) = pm
3107 if( qhyd(k,i,j) < eps )
then
3112 elseif( j1 == je+1 .and.
prc_has_n )
then
3115 l_path(k1,i1,j1) = pm
3125 call mpi_bcast(stop_flag, 1, mpi_integer, current_prc,
comm_world, ierr)
3127 if( stop_flag == 1 )
then
3129 call mpi_bcast(wild_flag, 1, mpi_integer, current_prc,
comm_world, ierr)
3132 ibuf(1:4) = end_grid(:)
3133 ibuf(5:6) = corr_flag(:)
3135 call mpi_bcast(ibuf, 6, mpi_integer, current_prc,
comm_world, ierr)
3136 end_grid(:) = ibuf(1:4)
3137 corr_flag(:) = ibuf(5:6)
3145 call mpi_bcast(comm_flag, 1, mpi_integer, current_prc,
comm_world, ierr)
3148 if( comm_flag == 1 )
then
3149 call mpi_bcast(comm_target, 1, mpi_integer, current_prc,
comm_world, ierr)
3152 call mpi_recv(ibuf, 6, mpi_integer, current_prc, 1,
comm_world, status, ierr)
3156 corr_flag(:) = ibuf(4:5)
3157 sign_flash = ibuf(6)
3164 ibuf(4:5) = corr_flag(:)
3165 ibuf(6) = sign_flash
3166 call mpi_send(ibuf, 6, mpi_integer, comm_target, 1,
comm_world, ierr)
3170 current_prc = comm_target
3184 if( wild_flag == 1 .and. end_grid(4) ==
prc_myrank )
then
3191 if( abs( qcrg(k2,i2,j2) ) > qrho_chan/dens(k2,i2,j2) .and. &
3192 abs( e_pot(k2,i2,j2) ) > abs( phi_end(iq) ) )
then
3193 l_path( k2,i2,j2 ) = l_path( k1,i1,j1 )
3201 if( abs( qcrg(k2,i2,j2) ) > qrho_chan/dens(k2,i2,j2) .and. &
3202 abs( e_pot(k2,i2,j2) ) > abs( phi_end(iq) ) )
then
3203 l_path( k2,i2,j2 ) = l_path( k1,i1,j1 )
3211 if( abs( qcrg(k2,i2,j2) ) > qrho_chan/dens(k2,i2,j2) .and. &
3212 abs( e_pot(k2,i2,j2) ) > abs( phi_end(iq) ) )
then
3213 l_path( k2,i2,j2 ) = l_path( k1,i1,j1 )
3221 if( abs( qcrg(k2,i2,j2) ) > qrho_chan/dens(k2,i2,j2) .and. &
3222 abs( e_pot(k2,i2,j2) ) > abs( phi_end(iq) ) )
then
3223 l_path( k2,i2,j2 ) = l_path( k1,i1,j1 )
3231 if( abs( qcrg(k2,i2,j2) ) > qrho_chan/dens(k2,i2,j2) .and. &
3232 abs( e_pot(k2,i2,j2) ) > abs( phi_end(iq) ) )
then
3233 l_path( k2,i2,j2 ) = l_path( k1,i1,j1 )
3241 if( abs( qcrg(k2,i2,j2) ) > qrho_chan/dens(k2,i2,j2) .and. &
3242 abs( e_pot(k2,i2,j2) ) > abs( phi_end(iq) ) )
then
3243 l_path( k2,i2,j2 ) = l_path( k1,i1,j1 )
3257 sumdqrho_pls = 0.0_rp
3258 sumdqrho_mns = 0.0_rp
3265 if( l_path(k,i,j) /= 0.0_rp .and. abs( qcrg(k,i,j) ) > qrho_chan )
then
3266 if ( qcrg(k,i,j) >= 0.0_rp )
then
3268 dqrho_pls(k,i,j) = fp * ( abs( qcrg(k,i,j) )-qrho_neut )
3269 sumdqrho_pls = sumdqrho_pls &
3270 + fp * ( abs( qcrg(k,i,j) )-qrho_neut )
3271 dqrho_mns(k,i,j) = 0.0_rp
3274 dqrho_mns(k,i,j) = fp * ( abs( qcrg(k,i,j) )-qrho_neut )
3275 sumdqrho_mns = sumdqrho_mns &
3276 + fp * ( abs( qcrg(k,i,j) )-qrho_neut )
3277 dqrho_pls(k,i,j) = 0.0_rp
3280 dqrho_pls(k,i,j) = 0.0_rp
3281 dqrho_mns(k,i,j) = 0.0_rp
3289 call mpi_allreduce(iprod, ibuf, 2, mpi_integer, mpi_sum,
comm_world, ierr)
3295 if ( ntot > 0 )
exit
3299 if ( count_path > nutr_itmax )
then
3300 log_info(
"ATMOS_PHY_LT_Efield",*)
"Reach limit iteration for searching flash path", count_path, npls, nmns, current_prc
3303 if( corr_flag(1) == 1 .and. corr_flag(2) == 1 )
then
3304 dqrho_cor = sumdqrho_pls - sumdqrho_mns
3309 dqrho_cor = dqrho_cor / ntot
3318 d_qcrg(k,i,j) = 0.0_rp
3325 if(
prc_num_x == 1 .and. imax == 2 )
then
3330 if( l_path(k,is,j) /= 0.0_rp )
then
3331 l_path(k,ie,j) = l_path(k,is,j)
3332 if( dqrho_pls(k,is,j) /= 0.0_rp )
then
3333 d_qcrg(k,is,j) = - dqrho_pls(k,is,j) - dqrho_cor
3334 d_qcrg(k,ie,j) = d_qcrg(k,is,j)
3335 elseif( dqrho_mns(k,is,j) /= 0.0_rp )
then
3336 d_qcrg(k,is,j) = dqrho_mns(k,is,j) - dqrho_cor
3337 d_qcrg(k,ie,j) = d_qcrg(k,is,j)
3339 elseif( l_path(k,ie,j) /= 0.0_rp )
then
3340 l_path(k,is,j) = l_path(k,ie,j)
3341 if( dqrho_pls(k,ie,j) /= 0.0_rp )
then
3342 d_qcrg(k,ie,j) = - dqrho_pls(k,ie,j) - dqrho_cor
3343 d_qcrg(k,is,j) = d_qcrg(k,ie,j)
3344 elseif( dqrho_mns(k,ie,j) /= 0.0_rp )
then
3345 d_qcrg(k,ie,j) = dqrho_mns(k,ie,j) - dqrho_cor
3346 d_qcrg(k,is,j) = d_qcrg(k,ie,j)
3351 if( flg_num_end(k,is,j,iq) == 1 )
then
3352 num_end(k,ie,j,iq) = num_end(k,ie,j,iq) + 1.0_rp
3354 if( flg_num_end(k,ie,j,iq) == 1 )
then
3355 num_end(k,is,j,iq) = num_end(k,is,j,iq) + 1.0_rp
3363 elseif(
prc_num_y == 1 .and. jmax == 2 )
then
3368 if( l_path(k,i,js) /= 0.0_rp )
then
3369 l_path(k,i,je) = l_path(k,i,js)
3370 if( dqrho_pls(k,i,js) /= 0.0_rp )
then
3371 d_qcrg(k,i,js) = - dqrho_pls(k,i,js) - dqrho_cor
3372 d_qcrg(k,i,je) = d_qcrg(k,i,js)
3373 elseif( dqrho_mns(k,i,js) /= 0.0_rp )
then
3374 d_qcrg(k,i,js) = dqrho_mns(k,i,js) - dqrho_cor
3375 d_qcrg(k,i,je) = d_qcrg(k,i,js)
3377 elseif( l_path(k,i,je) /= 0.0_rp )
then
3378 l_path(k,i,js) = l_path(k,i,je)
3379 if( dqrho_pls(k,i,je) /= 0.0_rp )
then
3380 d_qcrg(k,i,je) = - dqrho_pls(k,i,je) - dqrho_cor
3381 d_qcrg(k,i,js) = d_qcrg(k,i,je)
3382 elseif( dqrho_mns(k,i,je) /= 0.0_rp )
then
3383 d_qcrg(k,i,je) = dqrho_mns(k,i,je) - dqrho_cor
3384 d_qcrg(k,i,js) = d_qcrg(k,i,je)
3389 if( flg_num_end(k,i,js,iq) == 1 )
then
3390 num_end(k,i,je,iq) = num_end(k,i,je,iq) + 1.0_rp
3392 if( flg_num_end(k,i,je,iq) == 1 )
then
3393 num_end(k,i,js,iq) = num_end(k,i,js,iq) + 1.0_rp
3406 if( l_path(k,i,j) /= 0.0_rp .and. dqrho_pls(k,i,j) /= 0.0_rp )
then
3407 d_qcrg(k,i,j) = - dqrho_pls(k,i,j) - dqrho_cor
3408 elseif( l_path(k,i,j) /= 0.0_rp .and. dqrho_mns(k,i,j) /= 0.0_rp )
then
3409 d_qcrg(k,i,j) = dqrho_mns(k,i,j) - dqrho_cor
3421 lt_path(k,i,j) = lt_path(k,i,j) + l_path(k,i,j)
3435 KA, KS, KE, & ! [IN]
3436 IA, IS, IE, & ! [IN]
3437 JA, JS, JE, & ! [IN]
3444 NUM_end, & ! [INOUT]
3445 LT_path, & ! [INOUT]
3446 fls_int_p, & ! [OUT]
3494 integer,
intent(in) :: KA, KS, KE
3495 integer,
intent(in) :: IA, IS, IE
3496 integer,
intent(in) :: JA, JS, JE
3497 integer,
intent(in) :: KIJMAX
3498 real(RP),
intent(in) :: Efield (KA,IA,JA,4)
3499 real(RP),
intent(in) :: E_pot (KA,IA,JA)
3500 real(RP),
intent(in) :: QCRG (KA,IA,JA)
3501 real(RP),
intent(in) :: DENS (KA,IA,JA)
3502 real(RP),
intent(in) :: QHYD (KA,IA,JA)
3503 real(RP),
intent(inout) :: NUM_end (KA,IA,JA,3)
3504 real(RP),
intent(inout) :: LT_path (KA,IA,JA)
3505 real(RP),
intent(out) :: fls_int_p(KA,IA,JA)
3506 real(RP),
intent(out) :: d_QCRG (KA,IA,JA)
3507 real(RP),
intent(out) :: B_OUT (IA,JA)
3509 real(RP),
parameter :: q_thre = 0.1_rp
3511 real(RP) :: B(IA,JA)
3513 real(RP) :: Q_d, Fpls, Fmns
3514 real(RP) :: Spls, Smns
3515 real(RP) :: Spls_g, Smns_g
3516 real(RP) :: distance
3517 real(RP) :: Edif(KS:KE), Edif_max, abs_qcrg_max
3521 real(RP),
allocatable :: E_exce_x(:), E_exce_x_g(:)
3522 real(RP),
allocatable :: E_exce_y(:), E_exce_y_g(:)
3523 real(RP) :: exce_grid(2,KIJMAX)
3524 integer :: count1(PRC_nprocs)
3525 integer :: countindx(PRC_nprocs+1)
3527 integer :: num_total
3528 real(RP) :: rbuf1, rbuf2
3529 integer :: k, i, j, ipp, iq, ierr
3544 num_end(k,i,j,iq) = 0.0_rp
3560 edif(k) = efield(k,i,j,i_lt_abs) - ( eint-deleint )
3561 edif_max = max( edif_max, edif(k) )
3563 if ( edif_max > 0.0_rp )
then
3565 num_own = num_own + 1
3567 exce_grid(1,num_own) = cx(i)
3568 exce_grid(2,num_own) = cy(j)
3570 fls_int_p(k,i,j) = 0.5_rp + sign( 0.5_rp, edif(k)-eps )
3574 fls_int_p(k,i,j) = 0.0_rp
3585 allocate(e_exce_x(num_own))
3586 allocate(e_exce_y(num_own))
3589 e_exce_x(1:num_own) = exce_grid(1,1:num_own)
3590 e_exce_y(1:num_own) = exce_grid(2,1:num_own)
3592 call mpi_allgather( num_own, 1, mpi_integer, &
3593 count1(:), 1, mpi_integer, &
3597 do ipp = 1, prc_nprocs
3598 countindx(ipp+1) = countindx(ipp) + count1(ipp)
3604 num_total = countindx(prc_nprocs+1)
3605 allocate(e_exce_x_g(num_total))
3606 allocate(e_exce_y_g(num_total))
3620 do ipp = 1, num_total
3623 distance = sqrt( ( cx(i)-e_exce_x_g(ipp) )**2 &
3624 + ( cy(j)-e_exce_y_g(ipp) )**2 )
3625 if( distance <= r_neut )
then
3645 if ( c(i,j) == 1 )
then
3646 abs_qcrg_max = 0.0_rp
3649 abs_qcrg_max = max( abs_qcrg_max, abs( qcrg(k,i,j) ) )
3651 if ( abs_qcrg_max >= q_thre )
then
3654 sw = 0.5_rp + sign( 0.5_rp, qcrg(k,i,j) )
3655 spls = spls + qcrg(k,i,j) * sw
3656 smns = smns - qcrg(k,i,j) * ( 1.0_rp - sw )
3675 if( max( spls_g,smns_g )*0.3_rp < min( spls_g,smns_g ) )
then
3676 q_d = 0.3_rp * max( spls_g,smns_g )
3678 q_d = min( spls_g,smns_g )
3681 if( spls_g /= 0.0_rp )
then
3687 if( smns_g /= 0.0_rp )
then
3699 if( qcrg(k,i,j) > q_thre )
then
3700 d_qcrg(k,i,j) = - fpls * ( qcrg(k,i,j) - q_thre ) * b(i,j)
3701 lt_path(k,i,j) = lt_path(k,i,j) + b(i,j)
3702 elseif( qcrg(k,i,j) < -q_thre )
then
3703 d_qcrg(k,i,j) = + fmns * ( - qcrg(k,i,j) - q_thre ) * b(i,j)
3704 lt_path(k,i,j) = lt_path(k,i,j) - b(i,j)
3706 d_qcrg(k,i,j) = 0.0_rp
3721 deallocate(e_exce_x)
3722 deallocate(e_exce_y)
3723 deallocate(e_exce_x_g)
3724 deallocate(e_exce_y_g)
3736 KA, KS, KE, & ! [IN]
3737 IA, IS, IE, & ! [IN]
3738 JA, JS, JE, & ! [IN]
3750 integer,
intent(in) :: KA, KS, KE
3751 integer,
intent(in) :: IA, IS, IE
3752 integer,
intent(in) :: JA, JS, JE
3753 real(RP),
intent(in) :: DENS (KA,IA,JA)
3754 real(RP),
intent(in) :: Efield (KA,IA,JA)
3755 real(RP),
intent(out) :: Emax
3756 integer,
intent(out) :: flg_lt_neut
3758 real(RP) :: Eint_hgt(KA,IA,JA)
3759 real(RP) :: E_det, rbuf, rprod1
3760 integer :: own_prc_total, iprod1, buf
3761 integer :: k, i, j, ierr
3769 if( flg_eint_hgt == 1.0_rp )
then
3778 eint_hgt(k,i,j) = min( eint*dens(k,i,j)/rho0,eint )
3779 if( eint_hgt(k,i,j) < estop )
then
3780 eint_hgt(k,i,j) = large_num
3782 e_det = efield(k,i,j) - eint_hgt(k,i,j)
3783 if( e_det > 0.0_rp )
then
3784 own_prc_total = own_prc_total + 1
3799 e_det = efield(k,i,j) - ( eint-deleint )
3800 if( e_det > 0.0_rp )
then
3801 own_prc_total = own_prc_total + 1
3810 iprod1 = own_prc_total
3811 call mpi_allreduce(iprod1, buf, 1, mpi_integer, mpi_sum,
comm_world, ierr)
3818 rprod1 = max(rprod1,efield(k,i,j))
3830 if( emax < eint .and. emax >= eint-deleint .and. flg_eint_hgt == 0.0_rp )
then
3842 KA, KS, KE, & ! [IN]
3843 IA, IS, IE, & ! [IN]
3844 JA, JS, JE, & ! [IN]
3855 integer,
intent(in) :: ka, ks, ke
3856 integer,
intent(in) :: ia, is, ie
3857 integer,
intent(in) :: ja, js, je
3858 integer,
intent(in) :: nliq
3859 real(rp),
intent(in) :: temp(ka,ia,ja)
3860 real(rp),
intent(in) :: dens(ka,ia,ja)
3861 real(rp),
intent(in) :: qliq(ka,ia,ja,nliq)
3862 real(rp),
intent(out) :: dqcrg(ka,ia,ja)
3863 real(rp),
intent(out) :: beta_crg(ka,ia,ja)
3865 integer :: i, j, k, pp, qq, iq
3866 integer :: grid1, grid2
3868 real(rp) :: diffx, diffy, tmp
3878 if( temp(k,i,j) <= t00 .and. temp(k,i,j) >= tcrglimit )
then
3882 cwc = cwc + qliq(k,i,j,iq) * dens(k,i,j) * 1.0e+3_rp
3884 diffx = abs( grid_lut_t(1)-temp(k,i,j) )
3888 tmp = abs( grid_lut_t(pp)-temp(k,i,j) )
3889 if ( tmp < diffx )
then
3894 diffy = abs( grid_lut_l(1)-cwc )
3898 tmp = abs( grid_lut_l(qq)-cwc )
3899 if ( tmp < diffy )
then
3904 dqcrg(k,i,j) = dq_chrg( grid1, grid2 ) &
3905 *( 0.5_rp + sign( 0.5_rp,cwc-1.0e-2_rp ) )
3907 dqcrg(k,i,j) = 0.0_rp
3909 if( temp(k,i,j) >= -30.0_rp+t00 )
then
3910 beta_crg(k,i,j) = 1.0_rp
3911 elseif( temp(k,i,j) < -30.0_rp+t00 .and. temp(k,i,j) >= -43.0_rp+t00 )
then
3912 beta_crg(k,i,j) = 1.0_rp - ( ( temp(k,i,j)-t00+30.0_rp )/13.0_rp )**2
3915 beta_crg(k,i,j) = 0.0_rp
module atmosphere / grid / cartesC index
module Atmosphere Grid CartesianC metirc
real(rp), dimension(:,:,:,:), allocatable, public atmos_grid_cartesc_metric_gsqrt
transformation metrics from Z to Xi, {G}^1/2
real(rp), dimension(:,:,:,:), allocatable, public atmos_grid_cartesc_metric_mapf
map factor
real(rp), public atmos_grid_cartesc_metric_j33g
(3,3) element of Jacobian matrix * {G}^1/2
real(rp), dimension(:,:,:,:), allocatable, public atmos_grid_cartesc_metric_j23g
(2,3) element of Jacobian matrix * {G}^1/2
real(rp), dimension(:,:,:,:), allocatable, public atmos_grid_cartesc_metric_j13g
(1,3) element of Jacobian matrix * {G}^1/2
module atmosphere / grid / cartesC
real(rp), dimension(:), allocatable, public atmos_grid_cartesc_cy
center coordinate [m]: y, local
real(rp), dimension(:), allocatable, public atmos_grid_cartesc_rfdy
reciprocal of face-dy
real(rp), dimension(:), allocatable, public atmos_grid_cartesc_rcdx
reciprocal of center-dx
real(rp), dimension(:), allocatable, public atmos_grid_cartesc_rfdx
reciprocal of face-dx
real(rp), dimension(:), allocatable, public atmos_grid_cartesc_rcdz
reciprocal of center-dz
real(rp), dimension(:), allocatable, public atmos_grid_cartesc_rcdy
reciprocal of center-dy
real(rp), dimension(:), allocatable, public atmos_grid_cartesc_cdy
y-length of control volume [m]
real(rp), dimension(:), allocatable, public atmos_grid_cartesc_cz
center coordinate [m]: z, local
real(rp), dimension(:), allocatable, public atmos_grid_cartesc_cx
center coordinate [m]: x, local
real(rp), dimension(:), allocatable, public atmos_grid_cartesc_rfdz
reciprocal of face-dz
real(rp), dimension(:), allocatable, public atmos_grid_cartesc_cdx
x-length of control volume [m]
real(rp), dimension(:), allocatable, public atmos_grid_cartesc_cdz
z-length of control volume [m]
module atmosphere / physics / lightninh / SATO2019
subroutine gs_ilu(KA, KS, KE, IA, IS, IE, JA, JS, JE, Z, M, V, diag)
subroutine atmos_phy_lt_judge_abse(KA, KS, KE, IA, IS, IE, JA, JS, JE, DENS, Efield, Emax, flg_lt_neut)
judge max of |E| exceeds E_init
subroutine, public atmos_phy_lt_sato2019_finalize
finalize
subroutine ilu_decomp(KA, KS, KE, IA, IS, IE, JA, JS, JE, M, diag)
subroutine atmos_phy_lt_electric_field(KA, KS, KE, IA, IS, IE, JA, JS, JE, QCRG, DENS, RHOT, E_pot, Efield)
calculate electric field from charge density of each grid temporaly Bi-CGSTAB is used in this compone...
subroutine, public atmos_phy_lt_sato2019_setup(KA, KS, KE, IA, IS, IE, JA, JS, JE, IMAXG, JMAXG, KMAX, MP_TYPE, CDX, CDY)
Setup.
subroutine back_sub_ilu(KA, KS, KE, IA, IS, IE, JA, JS, JE, Z, M, V, diag)
subroutine, public atmos_phy_lt_sato2019_select_dqcrg_from_lut(KA, KS, KE, IA, IS, IE, JA, JS, JE, NLIQ, TEMP, DENS, QLIQ, dqcrg, beta_crg)
Select cwc-temp point on LUT.
subroutine atmos_phy_lt_neutralization_f2013(KA, KS, KE, IA, IS, IE, JA, JS, JE, KIJMAX, Efield, E_pot, DENS, QCRG, QHYD, NUM_end, LT_path, fls_int_p, d_QCRG, B_OUT)
calculate charge neutralization Fierro et al. (2013)
subroutine atmos_phy_lt_neutralization_mg2001(KA, KS, KE, IA, IS, IE, JA, JS, JE, KIJMAX, IMAX, JMAX, Efield, E_pot, DENS, QCRG, QHYD, NUM_end, LT_path, fls_int_p, d_QCRG)
calculate charge neutralization MacGorman et al. (2001)
subroutine atmos_phy_lt_solve_bicgstab(KA, KS, KE, IA, IS, IE, JA, JS, JE, PHI_N, PHI, M, B)
subroutine, public atmos_phy_lt_sato2019_adjustment(KA, KS, KE, IA, IS, IE, JA, JS, JE, KIJMAX, IMAX, JMAX, QA_LT, DENS, RHOT, QHYD, Sarea, dt_LT, QTRC, Epot)
Update of charge density.
integer, public comm_datatype
datatype of variable
integer, public comm_world
communication world ID
real(rp), public const_eps
small number
real(rp), parameter, public const_pi
pi
real(rp), parameter, public const_tem00
temperature reference (0C) [K]
real(rp), public const_huge
huge number
real(rp), public const_epsair
parts par million
real(rp), parameter, public const_epsvac
parts par million
subroutine, public file_history_reg(name, desc, unit, itemid, standard_name, ndims, dim_type, cell_measures, fill_halo)
Register/Append variable to history file.
integer, public io_fid_conf
Config file ID.
integer function, public io_get_available_fid()
search & get available file ID
logical, public prc_has_s
integer, dimension(8), public prc_next
node ID of 8 neighbour process
integer, public prc_num_x
x length of 2D processor topology
integer, parameter, public prc_s
[node direction] south
integer, parameter, public prc_nw
[node direction] northwest
integer, parameter, public prc_ne
[node direction] northeast
integer, parameter, public prc_se
[node direction] southeast
integer, parameter, public prc_sw
[node direction] southwest
integer, parameter, public prc_w
[node direction] west
integer, parameter, public prc_n
[node direction] north
logical, public prc_has_e
logical, public prc_has_n
integer, parameter, public prc_e
[node direction] east
logical, public prc_has_w
integer, public prc_num_y
y length of 2D processor topology
logical, public prc_ismaster
master process in local communicator?
integer, public prc_nprocs
myrank in local communicator
integer, parameter, public prc_masterrank
master process in each communicator
subroutine, public prc_abort
Abort Process.
integer, public prc_myrank
process num in local communicator
subroutine, public prc_mpibarrier
Barrier MPI.
integer, parameter, public dp
subroutine, public prof_rapend(rapname_base, level, disable_barrier)
Save raptime.
subroutine, public prof_rapstart(rapname_base, level, disable_barrier)
Start raptime.