14 #include "inc_openmp.h" 57 real(RP),
private,
allocatable :: dens_t(:,:,:)
58 real(RP),
private,
allocatable :: momz_t(:,:,:)
59 real(RP),
private,
allocatable :: momx_t(:,:,:)
60 real(RP),
private,
allocatable :: momy_t(:,:,:)
61 real(RP),
private,
allocatable :: rhot_t(:,:,:)
62 real(RP),
private,
allocatable :: rhoq_t(:,:,:,:)
64 real(RP),
private,
allocatable :: mflx_hi(:,:,:,:)
67 integer :: i_comm_dens = 1
68 integer :: i_comm_momz = 2
69 integer :: i_comm_momx = 3
70 integer :: i_comm_momy = 4
71 integer :: i_comm_rhot = 5
72 integer,
allocatable :: i_comm_prog(:)
74 integer :: i_comm_dens_t = 1
75 integer :: i_comm_momz_t = 2
76 integer :: i_comm_momx_t = 3
77 integer :: i_comm_momy_t = 4
78 integer :: i_comm_rhot_t = 5
80 integer,
allocatable :: i_comm_rhoq_t(:)
81 integer,
allocatable :: i_comm_qtrc(:)
83 integer :: i_comm_mflx_z = 1
84 integer :: i_comm_mflx_x = 2
85 integer :: i_comm_mflx_y = 3
93 DENS, MOMZ, MOMX, MOMY, RHOT, QTRC, PROG, &
110 real(RP),
intent(inout) :: DENS(
ka,
ia,
ja)
111 real(RP),
intent(inout) :: MOMZ(
ka,
ia,
ja)
112 real(RP),
intent(inout) :: MOMX(
ka,
ia,
ja)
113 real(RP),
intent(inout) :: MOMY(
ka,
ia,
ja)
114 real(RP),
intent(inout) :: RHOT(
ka,
ia,
ja)
115 real(RP),
intent(inout) :: QTRC(
ka,
ia,
ja,
qa)
116 real(RP),
intent(inout) :: PROG(
ka,
ia,
ja,
va)
117 real(RP),
intent(inout) :: mflx_hi(
ka,
ia,
ja,3)
122 allocate( dens_t(
ka,
ia,
ja) )
123 allocate( momz_t(
ka,
ia,
ja) )
124 allocate( momx_t(
ka,
ia,
ja) )
125 allocate( momy_t(
ka,
ia,
ja) )
126 allocate( rhot_t(
ka,
ia,
ja) )
129 allocate( i_comm_prog(max(
va,1)) )
130 allocate( i_comm_qtrc(
qa) )
131 allocate( i_comm_rhoq_t(
qa) )
139 i_comm_prog(iv) = 5 + iv
150 i_comm_rhoq_t(iq) = 5 +
va + iq
151 i_comm_qtrc(iq) = 5 +
va + iq
161 mflx_hi(:,:,:,:) = undef
169 DENS, MOMZ, MOMX, MOMY, RHOT, QTRC, PROG, &
170 DENS_av, MOMZ_av, MOMX_av, MOMY_av, RHOT_av, QTRC_av, &
172 num_diff, num_diff_q, &
174 DENS_tp, MOMZ_tp, MOMX_tp, MOMY_tp, RHOT_tp, RHOQ_tp, &
176 CDZ, CDX, CDY, FDZ, FDX, FDY, &
177 RCDZ, RCDX, RCDY, RFDZ, RFDX, RFDY, &
179 J13G, J23G, J33G, MAPF, &
181 REF_dens, REF_pott, REF_qv, REF_pres, &
182 BND_W, BND_E, BND_S, BND_N, &
183 ND_COEF, ND_COEF_Q, ND_ORDER, ND_SFC_FACT, ND_USE_RS, &
184 DAMP_DENS, DAMP_VELZ, DAMP_VELX, &
185 DAMP_VELY, DAMP_POTT, DAMP_QTRC, &
186 DAMP_alpha_DENS, DAMP_alpha_VELZ, DAMP_alpha_VELX, &
187 DAMP_alpha_VELY, DAMP_alpha_POTT, DAMP_alpha_QTRC, &
189 FLAG_FCT_MOMENTUM, FLAG_FCT_T, FLAG_FCT_TRACER, &
190 FLAG_FCT_ALONG_STREAM, &
237 real(RP),
intent(inout) :: DENS(
ka,
ia,
ja)
238 real(RP),
intent(inout) :: MOMZ(
ka,
ia,
ja)
239 real(RP),
intent(inout) :: MOMX(
ka,
ia,
ja)
240 real(RP),
intent(inout) :: MOMY(
ka,
ia,
ja)
241 real(RP),
intent(inout) :: RHOT(
ka,
ia,
ja)
242 real(RP),
intent(inout) :: QTRC(
ka,
ia,
ja,
qa)
243 real(RP),
intent(inout) :: PROG(
ka,
ia,
ja,
va)
245 real(RP),
intent(inout) :: DENS_av(
ka,
ia,
ja)
246 real(RP),
intent(inout) :: MOMZ_av(
ka,
ia,
ja)
247 real(RP),
intent(inout) :: MOMX_av(
ka,
ia,
ja)
248 real(RP),
intent(inout) :: MOMY_av(
ka,
ia,
ja)
249 real(RP),
intent(inout) :: RHOT_av(
ka,
ia,
ja)
250 real(RP),
intent(inout) :: QTRC_av(
ka,
ia,
ja,
qa)
252 real(RP),
intent(out) :: mflx_hi(
ka,
ia,
ja,3)
253 real(RP),
intent(out) :: tflx_hi(
ka,
ia,
ja,3)
255 real(RP),
intent(out) :: num_diff(
ka,
ia,
ja,5,3)
256 real(RP),
intent(out) :: num_diff_q(
ka,
ia,
ja,3)
258 real(RP),
intent(in) :: QTRC0(
ka,
ia,
ja,
qa)
260 real(RP),
intent(in) :: DENS_tp(
ka,
ia,
ja)
261 real(RP),
intent(in) :: MOMZ_tp(
ka,
ia,
ja)
262 real(RP),
intent(in) :: MOMX_tp(
ka,
ia,
ja)
263 real(RP),
intent(in) :: MOMY_tp(
ka,
ia,
ja)
264 real(RP),
intent(in) :: RHOT_tp(
ka,
ia,
ja)
265 real(RP),
intent(in) :: RHOQ_tp(
ka,
ia,
ja,
qa)
267 real(RP),
intent(in) :: CORIOLI(
ia,
ja)
269 real(RP),
intent(in) :: CDZ (
ka)
270 real(RP),
intent(in) :: CDX (
ia)
271 real(RP),
intent(in) :: CDY (
ja)
272 real(RP),
intent(in) :: FDZ (
ka-1)
273 real(RP),
intent(in) :: FDX (
ia-1)
274 real(RP),
intent(in) :: FDY (
ja-1)
275 real(RP),
intent(in) :: RCDZ(
ka)
276 real(RP),
intent(in) :: RCDX(
ia)
277 real(RP),
intent(in) :: RCDY(
ja)
278 real(RP),
intent(in) :: RFDZ(
ka-1)
279 real(RP),
intent(in) :: RFDX(
ia-1)
280 real(RP),
intent(in) :: RFDY(
ja-1)
282 real(RP),
intent(in) :: PHI (
ka,
ia,
ja)
283 real(RP),
intent(in) :: GSQRT(
ka,
ia,
ja,7)
284 real(RP),
intent(in) :: J13G (
ka,
ia,
ja,7)
285 real(RP),
intent(in) :: J23G (
ka,
ia,
ja,7)
286 real(RP),
intent(in) :: J33G
287 real(RP),
intent(in) :: MAPF (
ia,
ja,2,4)
289 real(RP),
intent(in) :: AQ_CV(
qqa)
291 real(RP),
intent(in) :: REF_dens(
ka,
ia,
ja)
292 real(RP),
intent(in) :: REF_pott(
ka,
ia,
ja)
293 real(RP),
intent(in) :: REF_qv (
ka,
ia,
ja)
294 real(RP),
intent(in) :: REF_pres(
ka,
ia,
ja)
296 logical,
intent(in) :: BND_W
297 logical,
intent(in) :: BND_E
298 logical,
intent(in) :: BND_S
299 logical,
intent(in) :: BND_N
301 real(RP),
intent(in) :: ND_COEF
302 real(RP),
intent(in) :: ND_COEF_Q
303 integer,
intent(in) :: ND_ORDER
304 real(RP),
intent(in) :: ND_SFC_FACT
305 logical,
intent(in) :: ND_USE_RS
307 real(RP),
intent(in) :: DAMP_DENS(
ka,
ia,
ja)
308 real(RP),
intent(in) :: DAMP_VELZ(
ka,
ia,
ja)
309 real(RP),
intent(in) :: DAMP_VELX(
ka,
ia,
ja)
310 real(RP),
intent(in) :: DAMP_VELY(
ka,
ia,
ja)
311 real(RP),
intent(in) :: DAMP_POTT(
ka,
ia,
ja)
314 real(RP),
intent(in) :: DAMP_alpha_DENS(
ka,
ia,
ja)
315 real(RP),
intent(in) :: DAMP_alpha_VELZ(
ka,
ia,
ja)
316 real(RP),
intent(in) :: DAMP_alpha_VELX(
ka,
ia,
ja)
317 real(RP),
intent(in) :: DAMP_alpha_VELY(
ka,
ia,
ja)
318 real(RP),
intent(in) :: DAMP_alpha_POTT(
ka,
ia,
ja)
319 real(RP),
intent(in) :: DAMP_alpha_QTRC(
ka,
ia,
ja,
bnd_qa)
321 real(RP),
intent(in) :: divdmp_coef
323 logical,
intent(in) :: FLAG_FCT_MOMENTUM
324 logical,
intent(in) :: FLAG_FCT_T
325 logical,
intent(in) :: FLAG_FCT_TRACER
326 logical,
intent(in) :: FLAG_FCT_ALONG_STREAM
328 logical,
intent(in) :: USE_AVERAGE
330 real(DP),
intent(in) :: DTLS
331 real(DP),
intent(in) :: DTSS
332 logical ,
intent(in) :: Llast
335 real(RP) :: DENS00 (
ka,
ia,
ja)
338 real(RP) :: DDIV (
ka,
ia,
ja)
339 real(RP) :: DPRES0 (
ka,
ia,
ja)
340 real(RP) :: RT2P (
ka,
ia,
ja)
341 real(RP) :: REF_rhot(
ka,
ia,
ja)
349 real(RP) :: DENS_tq(
ka,
ia,
ja)
350 real(RP) :: diff(
ka,
ia,
ja)
353 real(RP) :: damp_t(
ka,
ia,
ja)
357 real(RP) :: mflx_av (
ka,
ia,
ja,3)
358 real(RP) :: qflx_hi (
ka,
ia,
ja,3)
359 real(RP) :: qflx_lo (
ka,
ia,
ja,3)
360 real(RP) :: qflx_anti(
ka,
ia,
ja,3)
368 integer :: i, j, k, iq, step
371 real(RP) :: diff_coef
376 dts =
real(DTSS, kind=RP) 377 dtl =
real(DTLS, kind=RP) 378 nstep = ceiling( ( dtl - eps ) / dts )
384 '*** -> DT_large, DT_small, DT_large/DT_small : ', dtl,
', ', dts,
', ', nstep
386 dens00(:,:,:) = undef
388 num_diff(:,:,:,:,:) = undef
390 mflx_hi(:,:,:,:) = undef
391 tflx_hi(:,:,:,:) = undef
393 qflx_hi(:,:,:,:) = undef
394 qflx_lo(:,:,:,:) = undef
398 dens00(:,:,:) = dens(:,:,:)
400 if ( use_average )
then 402 dens_av(:,:,:) = 0.0_rp
404 momz_av(:,:,:) = 0.0_rp
406 momx_av(:,:,:) = 0.0_rp
408 momy_av(:,:,:) = 0.0_rp
410 rhot_av(:,:,:) = 0.0_rp
415 mflx_av(:,:,:,:) = 0.0_rp
436 pres = p0 * ( rdry * rhot(k,i,j) / p0 )**cpovcv
437 rt2p(k,i,j) = cpovcv * pres / rhot(k,i,j)
442 cvtot = cvtot + aq_cv(iq) * qtrc(k,i,j,iq)
443 qdry = qdry - qtrc(k,i,j,iq)
445 cvtot = cvdry * qdry + cvtot
446 rtot = rdry * qdry + rvap * qtrc(k,i,j,
i_qv)
448 pres = p0 * ( rtot * rhot(k,i,j) / p0 )**( cptot / cvtot )
449 rt2p(k,i,j) = cptot / cvtot * pres / rhot(k,i,j)
451 dpres0(k,i,j) = pres - ref_pres(k,i,j)
452 ref_rhot(k,i,j) = rhot(k,i,j)
454 dpres0(
ks-1,i,j) = dpres0(
ks+1,i,j) + ( ref_pres(
ks+1,i,j) - ref_pres(
ks-1,i,j) )
455 dpres0(
ke+1,i,j) = dpres0(
ke-1,i,j) + ( ref_pres(
ke-1,i,j) - ref_pres(
ke+1,i,j) )
469 damp_t(:,:,:) = 0.0_rp
473 dens_tq(:,:,:) = 0.0_rp
482 diff(k,i,j) = qtrc(k,i,j,iq) - damp_qtrc(k,i,j,iq)
491 damp = - damp_alpha_qtrc(k,i,j,iq) &
493 - ( diff(k,i-1,j) + diff(k,i+1,j) + diff(k,i,j-1) + diff(k,i,j+1) - diff(k,i,j)*4.0_rp ) &
494 * 0.125_rp * bnd_smoother_fact )
498 damp = damp * dens00(k,i,j)
499 rhoq_t(k,i,j,iq) = rhoq_tp(k,i,j,iq) + damp
500 dens_tq(k,i,j) = dens_tq(k,i,j) + damp
505 call hist_in(rhoq_tp(:,:,:,iq), trim(
aq_name(iq))//
'_t_phys', &
506 'tendency of '//trim(
aq_name(iq))//
' due to physics',
'kg/kg/s' )
507 call hist_in(damp_t, trim(
aq_name(iq))//
'_t_damp', &
508 'tendency of '//trim(
aq_name(iq))//
' due to rayleigh damping',
'kg/kg/s' )
513 rhoq_t( 1:
ks-1,i,j,iq) = 0.0_rp
514 rhoq_t(
ke+1:
ka ,i,j,iq) = 0.0_rp
518 call comm_vars8( rhoq_t(:,:,:,iq), i_comm_rhoq_t(iq) )
519 call comm_wait ( rhoq_t(:,:,:,iq), i_comm_rhoq_t(iq), .false. )
529 rhoq_t(k,i,j,iq) = rhoq_tp(k,i,j,iq)
543 mflx_hi(k,
is-1,j,
xdir) = gsqrt(k,
is-1,j,
i_uyz) * momx(k,
is-1,j) / mapf(
is-1,j,2,
i_uy)
551 mflx_hi(k,
ie,j,
xdir) = gsqrt(k,
ie,j,
i_uyz) * momx(k,
ie,j) / mapf(
ie,j,2,
i_uy)
559 mflx_hi(k,i,
js-1,
ydir) = gsqrt(k,i,
js-1,
i_xvz) * momy(k,i,
js-1) / mapf(i,
js-1,1,
i_xv)
567 mflx_hi(k,i,
je,
ydir) = gsqrt(k,i,
je,
i_xvz) * momy(k,i,
je) / mapf(i,
je,1,
i_xv)
577 call hist_switch( llast .AND. step == nstep )
588 diff(k,i,j) = dens(k,i,j) - damp_dens(k,i,j)
597 damp = - damp_alpha_dens(k,i,j) &
599 - ( diff(k,i-1,j) + diff(k,i+1,j) + diff(k,i,j-1) + diff(k,i,j+1) - diff(k,i,j)*4.0_rp ) &
600 * 0.125_rp * bnd_smoother_fact ) &
602 dens_t(k,i,j) = dens_tp(k,i,j) &
613 dens_t( 1:
ks-1,i,j) = 0.0_rp
614 dens_t(
ke+1:
ka ,i,j) = 0.0_rp
617 call comm_vars8( dens_t(:,:,:), i_comm_dens_t )
619 call hist_in(dens_tp,
'DENS_t_phys',
'tendency of dencity due to physics',
'kg/m3/s' )
620 call hist_in(damp_t,
'DENS_t_damp',
'tendency of dencity due to rayleigh damping',
'kg/m3/s' )
628 diff(k,i,j) = momz(k,i,j) - damp_velz(k,i,j) * ( dens(k,i,j)+dens(k+1,i,j) ) * 0.5_rp
637 damp = - damp_alpha_velz(k,i,j) &
639 - ( diff(k,i-1,j) + diff(k,i+1,j) + diff(k,i,j-1) + diff(k,i,j+1) - diff(k,i,j)*4.0_rp ) &
640 * 0.125_rp * bnd_smoother_fact )
641 momz_t(k,i,j) = momz_tp(k,i,j) &
652 momz_t( 1:
ks-1,i,j) = 0.0_rp
653 momz_t(
ke:
ka ,i,j) = 0.0_rp
656 call comm_vars8( momz_t(:,:,:), i_comm_momz_t )
658 call hist_in(momz_tp,
'MOMZ_t_phys',
'tendency of momentum z due to physics',
'kg/m2/s2', zdim=
'half' )
659 call hist_in(damp_t,
'MOMZ_t_damp',
'tendency of momentum z due to rayleigh damping',
'kg/m2/s2', zdim=
'half' )
667 diff(k,i,j) = momx(k,i,j) - damp_velx(k,i,j) * ( dens(k,i,j)+dens(k,i+1,j) ) * 0.5_rp
675 damp = - damp_alpha_velx(k,i,j) &
677 - ( diff(k,i-1,j) + diff(k,i+1,j) + diff(k,i,j-1) + diff(k,i,j+1) - diff(k,i,j)*4.0_rp ) &
678 * 0.125_rp * bnd_smoother_fact )
679 momx_t(k,i,j) = momx_tp(k,i,j) &
690 momx_t( 1:
ks-1,i,j) = 0.0_rp
691 momx_t(
ke+1:
ka ,i,j) = 0.0_rp
694 call comm_vars8( momx_t(:,:,:), i_comm_momx_t )
696 call hist_in(momx_tp,
'MOMX_t_phys',
'tendency of momentum x due to physics',
'kg/m2/s2', xdim=
'half' )
697 call hist_in(damp_t,
'MOMX_t_damp',
'tendency of momentum x due to rayleigh damping',
'kg/m2/s2', xdim=
'half' )
705 diff(k,i,j) = momy(k,i,j) - damp_vely(k,i,j) * ( dens(k,i,j)+dens(k,i,j+1) ) * 0.5_rp
713 damp = - damp_alpha_vely(k,i,j) &
715 - ( diff(k,i-1,j) + diff(k,i+1,j) + diff(k,i,j-1) + diff(k,i,j+1) - diff(k,i,j)*4.0_rp ) &
716 * 0.125_rp * bnd_smoother_fact )
717 momy_t(k,i,j) = momy_tp(k,i,j) &
728 momy_t( 1:
ks-1,i,j) = 0.0_rp
729 momy_t(
ke+1:
ka ,i,j) = 0.0_rp
732 call comm_vars8( momy_t(:,:,:), i_comm_momy_t )
734 call hist_in(momy_tp,
'MOMY_t_phys',
'tendency of momentum y due to physics',
'kg/m2/s2', ydim=
'half' )
735 call hist_in(damp_t,
'MOMY_t_damp',
'tendency of momentum y due to rayleigh damping',
'kg/m2/s2', ydim=
'half' )
743 diff(k,i,j) = rhot(k,i,j) - damp_pott(k,i,j) * dens(k,i,j)
751 damp = - damp_alpha_pott(k,i,j) &
753 - ( diff(k,i-1,j) + diff(k,i+1,j) + diff(k,i,j-1) + diff(k,i,j+1) - diff(k,i,j)*4.0_rp ) &
754 * 0.125_rp * bnd_smoother_fact )
755 rhot_t(k,i,j) = rhot_tp(k,i,j) &
766 rhot_t( 1:
ks-1,i,j) = 0.0_rp
767 rhot_t(
ke+1:
ka ,i,j) = 0.0_rp
770 call comm_vars8( rhot_t(:,:,:), i_comm_rhot_t )
772 call hist_in(rhot_tp,
'RHOT_t_phys',
'tendency of rho*theta temperature due to physics',
'K kg/m3/s' )
773 call hist_in(damp_t,
'RHOT_t_damp',
'tendency of rho*theta temperature due to rayleigh damping',
'K kg/m3/s' )
776 call comm_wait ( dens_t(:,:,:), i_comm_dens_t, .false. )
777 call comm_wait ( momz_t(:,:,:), i_comm_momz_t, .false. )
778 call comm_wait ( momx_t(:,:,:), i_comm_momx_t, .false. )
779 call comm_wait ( momy_t(:,:,:), i_comm_momy_t, .false. )
780 call comm_wait ( rhot_t(:,:,:), i_comm_rhot_t, .false. )
788 if ( nd_coef == 0.0_rp )
then 790 num_diff(:,:,:,:,:) = 0.0_rp
793 dens, momz, momx, momy, rhot, &
794 cdz, cdx, cdy, fdz, fdx, fdy, dts, &
795 ref_dens, ref_pott, &
796 nd_coef, nd_order, nd_sfc_fact, nd_use_rs )
801 if ( divdmp_coef > 0.0_rp )
then 805 gsqrt, j13g, j23g, j33g, mapf, &
806 rcdz, rcdx, rcdy, rfdz, fdz )
823 dens_t, momz_t, momx_t, momy_t, rhot_t, &
824 dpres0, rt2p, corioli, &
825 num_diff, divdmp_coef, ddiv, &
826 flag_fct_momentum, flag_fct_t, &
827 flag_fct_along_stream, &
828 cdz, fdz, fdx, fdy, &
829 rcdz, rcdx, rcdy, rfdz, rfdx, rfdy, &
830 phi, gsqrt, j13g, j23g, j33g, mapf, &
831 ref_dens, ref_rhot, &
832 bnd_w, bnd_e, bnd_s, bnd_n, &
844 bnd_w, bnd_e, bnd_s, bnd_n )
849 dens( 1:
ks-1,i,j) = dens(
ks,i,j)
850 momz( 1:
ks-1,i,j) = momz(
ks,i,j)
851 momx( 1:
ks-1,i,j) = momx(
ks,i,j)
852 momy( 1:
ks-1,i,j) = momy(
ks,i,j)
853 rhot( 1:
ks-1,i,j) = rhot(
ks,i,j)
855 prog( 1:
ks-1,i,j,iv) = prog(
ks,i,j,iv)
857 dens(
ke+1:
ka, i,j) = dens(
ke,i,j)
858 momz(
ke+1:
ka, i,j) = momz(
ke,i,j)
859 momx(
ke+1:
ka, i,j) = momx(
ke,i,j)
860 momy(
ke+1:
ka, i,j) = momy(
ke,i,j)
861 rhot(
ke+1:
ka, i,j) = rhot(
ke,i,j)
863 prog(
ke+1:
ka, i,j,iv) = prog(
ke,i,j,iv)
868 call comm_vars8( dens(:,:,:), i_comm_dens )
869 call comm_vars8( momz(:,:,:), i_comm_momz )
870 call comm_vars8( momx(:,:,:), i_comm_momx )
871 call comm_vars8( momy(:,:,:), i_comm_momy )
872 call comm_vars8( rhot(:,:,:), i_comm_rhot )
874 call comm_vars8( prog(:,:,:,iv), i_comm_prog(iv) )
876 call comm_wait ( dens(:,:,:), i_comm_dens, .false. )
877 call comm_wait ( momz(:,:,:), i_comm_momz, .false. )
878 call comm_wait ( momx(:,:,:), i_comm_momx, .false. )
879 call comm_wait ( momy(:,:,:), i_comm_momy, .false. )
880 call comm_wait ( rhot(:,:,:), i_comm_rhot, .false. )
882 call comm_wait ( prog(:,:,:,iv), i_comm_prog(iv), .false. )
885 if ( use_average )
then 886 dens_av(:,:,:) = dens_av(:,:,:) + dens(:,:,:)
887 momz_av(:,:,:) = momz_av(:,:,:) + momz(:,:,:)
888 momx_av(:,:,:) = momx_av(:,:,:) + momx(:,:,:)
889 momy_av(:,:,:) = momy_av(:,:,:) + momy(:,:,:)
890 rhot_av(:,:,:) = rhot_av(:,:,:) + rhot(:,:,:)
894 mflx_av(:,:,:,:) = mflx_av(:,:,:,:) + mflx_hi(:,:,:,:)
899 if ( use_average )
then 900 dens_av(:,:,:) = dens_av(:,:,:) / nstep
901 momz_av(:,:,:) = momz_av(:,:,:) / nstep
902 momx_av(:,:,:) = momx_av(:,:,:) / nstep
903 momy_av(:,:,:) = momy_av(:,:,:) / nstep
904 rhot_av(:,:,:) = rhot_av(:,:,:) / nstep
913 mflx_hi(:,:,:,:) = mflx_av(:,:,:,:) / nstep
915 call comm_vars8( mflx_hi(:,:,:,
zdir), i_comm_mflx_z )
916 call comm_vars8( mflx_hi(:,:,:,
xdir), i_comm_mflx_x )
917 call comm_vars8( mflx_hi(:,:,:,
ydir), i_comm_mflx_y )
918 call comm_wait ( mflx_hi(:,:,:,
zdir), i_comm_mflx_z, .false. )
919 call comm_wait ( mflx_hi(:,:,:,
xdir), i_comm_mflx_x, .false. )
920 call comm_wait ( mflx_hi(:,:,:,
ydir), i_comm_mflx_y, .false. )
922 if ( use_average )
then 924 qtrc_av(:,:,:,:) = 0.0_rp
939 if ( nd_coef_q == 0.0_rp )
then 941 num_diff_q(:,:,:,:) = 0.0_rp
944 dens00, qtrc(:,:,:,iq), &
945 cdz, cdx, cdy, dtl, &
947 nd_coef_q, nd_order, nd_sfc_fact, nd_use_rs )
956 qtrc0(:,:,:,iq), rhoq_t(:,:,:,iq), &
958 mflx_hi, num_diff_q, &
959 gsqrt, mapf(:,:,:,
i_xy), &
960 cdz, rcdz, rcdx, rcdy, &
962 llast .AND. flag_fct_tracer, &
963 flag_fct_along_stream )
968 if ( use_average )
then 969 qtrc_av(:,:,:,iq) = qtrc(:,:,:,iq)
972 call comm_vars8( qtrc(:,:,:,iq), i_comm_qtrc(iq) )
977 call comm_wait ( qtrc(:,:,:,iq), i_comm_qtrc(iq), .false. )
991 BND_W, BND_E, BND_S, BND_N &
1005 real(RP),
intent(in) :: DENS (
ka,
ia,
ja)
1006 real(RP),
intent(in) :: DAMP_DENS(
ka,
ia,
ja)
1007 real(RP),
intent(in) :: mflx_hi (
ka,
ia,
ja,3)
1008 real(RP),
intent(in) :: tflx_hi (
ka,
ia,
ja,3)
1009 real(RP),
intent(in) :: GSQRT (
ka,
ia,
ja,7)
1010 real(RP),
intent(in) :: MAPF (
ia,
ja,2,7)
1011 real(RP),
intent(in) :: RCDX(
ia)
1012 real(RP),
intent(in) :: RCDY(
ja)
1013 real(RP),
intent(in) :: dt
1014 integer,
intent(in) :: step
1015 logical,
intent(in) :: BND_W
1016 logical,
intent(in) :: BND_E
1017 logical,
intent(in) :: BND_S
1018 logical,
intent(in) :: BND_N
1021 real(RP) :: mflx_lb_horizontal(
ka)
1022 real(RP) :: allmflx_lb_horizontal(
ka)
1023 real(RP) :: mflx_lb_total
1024 real(RP) :: mass_total
1025 real(RP) :: mass_total2
1026 real(RP) :: allmflx_lb_total
1027 real(RP) :: allmass_total
1028 real(RP) :: allmass_total2
1034 call hist_in(mflx_hi(:,:,:,
zdir),
'MFLXZ',
'momentum flux of z-direction',
'kg/m2/s', zdim=
'half' )
1035 call hist_in(mflx_hi(:,:,:,
xdir),
'MFLXX',
'momentum flux of x-direction',
'kg/m2/s', xdim=
'half' )
1036 call hist_in(mflx_hi(:,:,:,
ydir),
'MFLXY',
'momentum flux of y-direction',
'kg/m2/s', ydim=
'half' )
1038 call hist_in(tflx_hi(:,:,:,
zdir),
'TFLXZ',
'potential temperature flux of z-direction',
'K*kg/m2/s', zdim=
'half' )
1039 call hist_in(tflx_hi(:,:,:,
xdir),
'TFLXX',
'potential temperature flux of x-direction',
'K*kg/m2/s', xdim=
'half' )
1040 call hist_in(tflx_hi(:,:,:,
ydir),
'TFLXY',
'potential temperature flux of y-direction',
'K*kg/m2/s', ydim=
'half' )
1042 mflx_lb_total = 0.0_rp
1043 mflx_lb_horizontal(:) = 0.0_rp
1044 allmflx_lb_horizontal(:) = 0.0_rp
1050 mflx_lb_total = mflx_lb_total + mflx_hi(k,i-1,j,
xdir) * rcdx(i) * vol(k,i,j) &
1051 * mapf(i,j,1,
i_xy) * mapf(i,j,2,
i_xy) / gsqrt(k,i,j,
i_xyz) * dt
1052 mflx_lb_horizontal(k) = mflx_lb_horizontal(k) + mflx_hi(k,i-1,j,
xdir) * rcdx(i) * vol(k,i,j) &
1053 * mapf(i,j,1,
i_xy) * mapf(i,j,2,
i_xy) / gsqrt(k,i,j,
i_xyz) * dt
1062 mflx_lb_total = mflx_lb_total - mflx_hi(k,i,j,
xdir) * rcdx(i) * vol(k,i,j) &
1063 * mapf(i,j,1,
i_xy) * mapf(i,j,2,
i_xy) / gsqrt(k,i,j,
i_xyz) * dt
1064 mflx_lb_horizontal(k) = mflx_lb_horizontal(k) - mflx_hi(k,i,j,
xdir) * rcdx(i) * vol(k,i,j) &
1065 * mapf(i,j,1,
i_xy) * mapf(i,j,2,
i_xy) / gsqrt(k,i,j,
i_xyz) * dt
1073 mflx_lb_total = mflx_lb_total + mflx_hi(k,i,j-1,
ydir) * rcdy(j) * vol(k,i,j) &
1074 * mapf(i,j,1,
i_xy) * mapf(i,j,2,
i_xy) / gsqrt(k,i,j,
i_xyz) * dt
1075 mflx_lb_horizontal(k) = mflx_lb_horizontal(k) + mflx_hi(k,i,j-1,
ydir) * rcdy(j) * vol(k,i,j) &
1076 * mapf(i,j,1,
i_xy) * mapf(i,j,2,
i_xy) / gsqrt(k,i,j,
i_xyz) * dt
1084 mflx_lb_total = mflx_lb_total - mflx_hi(k,i,j,
ydir) * rcdy(j) * vol(k,i,j) &
1085 * mapf(i,j,1,
i_xy) * mapf(i,j,2,
i_xy) / gsqrt(k,i,j,
i_xyz) * dt
1086 mflx_lb_horizontal(k) = mflx_lb_horizontal(k) - mflx_hi(k,i,j,
ydir) * rcdy(j) * vol(k,i,j) &
1087 * mapf(i,j,1,
i_xy) * mapf(i,j,2,
i_xy) / gsqrt(k,i,j,
i_xyz) * dt
1093 mass_total2 = 0.0_rp
1099 mass_total = mass_total + dens(k,i,j) * vol(k,i,j)
1100 mass_total2 = mass_total2 + damp_dens(k,i,j) * vol(k,i,j)
1105 call mpi_allreduce( mflx_lb_total, &
1113 if(
io_l )
write(
io_fid_log,
'(A,1x,I1,1x,ES24.17)')
'total mflx_lb:', step, allmflx_lb_total
1115 call mpi_allreduce( mass_total, &
1123 if(
io_l )
write(
io_fid_log,
'(A,1x,I1,1x,ES24.17)')
'total mass :', step, allmass_total
1125 call mpi_allreduce( mass_total2, &
1133 if(
io_l )
write(
io_fid_log,
'(A,1x,I1,1x,ES24.17)')
'total mass2 :', step, allmass_total2
1135 call mpi_allreduce( mflx_lb_horizontal(
ks:
ke), &
1136 allmflx_lb_horizontal(
ks:
ke), &
1143 call hist_in(allmflx_lb_horizontal(:),
'ALLMOM_lb_hz', &
1144 'horizontally total momentum flux from lateral boundary',
'kg/m2/s' )
integer, public is
start point of inner domain: x, local
integer, public comm_datatype
datatype of variable
subroutine, public atmos_dyn_tstep_large_fvm_heve(DENS, MOMZ, MOMX, MOMY, RHOT, QTRC, PROG, DENS_av, MOMZ_av, MOMX_av, MOMY_av, RHOT_av, QTRC_av, mflx_hi, tflx_hi, num_diff, num_diff_q, QTRC0, DENS_tp, MOMZ_tp, MOMX_tp, MOMY_tp, RHOT_tp, RHOQ_tp, CORIOLI, CDZ, CDX, CDY, FDZ, FDX, FDY, RCDZ, RCDX, RCDY, RFDZ, RFDX, RFDY, PHI, GSQRT, J13G, J23G, J33G, MAPF, AQ_CV, REF_dens, REF_pott, REF_qv, REF_pres, BND_W, BND_E, BND_S, BND_N, ND_COEF, ND_COEF_Q, ND_ORDER, ND_SFC_FACT, ND_USE_RS, DAMP_DENS, DAMP_VELZ, DAMP_VELX, DAMP_VELY, DAMP_POTT, DAMP_QTRC, DAMP_alpha_DENS, DAMP_alpha_VELZ, DAMP_alpha_VELX, DAMP_alpha_VELY, DAMP_alpha_POTT, DAMP_alpha_QTRC, divdmp_coef, FLAG_FCT_MOMENTUM, FLAG_FCT_T, FLAG_FCT_TRACER, FLAG_FCT_ALONG_STREAM, USE_AVERAGE, DTLS, DTSS, Llast)
Dynamical Process.
real(rp), public const_cvdry
specific heat (dry air,constant volume) [J/kg/K]
subroutine, public atmos_dyn_tstep_large_fvm_heve_setup(DENS, MOMZ, MOMX, MOMY, RHOT, QTRC, PROG, mflx_hi)
Setup.
integer, public je
end point of inner domain: y, local
logical, public prc_has_n
subroutine, public prc_mpistop
Abort MPI.
subroutine, public atmos_dyn_numfilter_coef_q(num_diff_q, DENS, QTRC, CDZ, CDX, CDY, dt, REF_qv, iq, ND_COEF, ND_ORDER, ND_SFC_FACT, ND_USE_RS)
Calc coefficient of numerical filter.
module Atmosphere / Dynamics Temporal integration
subroutine, public atmos_dyn_numfilter_coef(num_diff, DENS, MOMZ, MOMX, MOMY, RHOT, CDZ, CDX, CDY, FDZ, FDX, FDY, DT, REF_dens, REF_pott, ND_COEF, ND_ORDER, ND_SFC_FACT, ND_USE_RS)
Calc coefficient of numerical filter.
subroutine, public atmos_dyn_fvm_fluxy_xyz_ud1(flux, mflx, val, GSQRT, CDZ, IIS, IIE, JJS, JJE)
calculation Y-flux at XYZ
logical, public io_l
output log or not? (this process)
integer, parameter, public zdir
procedure(flux_phi), pointer, public atmos_dyn_fvm_fluxx_xyz
logical, public prc_has_e
integer, parameter, public ydir
integer, public ke
end point of inner domain: z, local
subroutine check_mass(DENS, DAMP_DENS, mflx_hi, tflx_hi, GSQRT, MAPF, RCDX, RCDY, dt, step, BND_W, BND_E, BND_S, BND_N)
integer, parameter, public xdir
subroutine, public check(current_line, v)
Undefined value checker.
module Atmosphere / Dynamics Temporal integration
logical, public prc_has_s
real(rp), public const_rdry
specific gas constant (dry air) [J/kg/K]
real(rp), public const_undef
real(rp), public const_ohm
angular velocity of the planet [1/s]
integer, public ia
of x whole cells (local, with HALO)
subroutine, public comm_vars8_init(var, vid)
Register variables.
integer, public ka
of z whole cells (local, with HALO)
real(rp), public const_pre00
pressure reference [Pa]
integer, public comm_world
communication world ID
integer, public kmax
of computational cells: z
character(len=h_short), dimension(:), allocatable, public aq_name
subroutine, public atmos_dyn_fvm_fluxz_xyz_ud1(flux, mflx, val, GSQRT, CDZ, IIS, IIE, JJS, JJE)
calculation z-flux at XYZ
integer, public js
start point of inner domain: y, local
procedure(tinteg), pointer, public atmos_dyn_tinteg_tracer
integer, parameter, public const_undef2
undefined value (INT2)
module Atmosphere / Dynamics common
real(rp), dimension(:,:,:), allocatable, public real_vol
control volume [m3]
real(rp), parameter, public const_rvap
specific gas constant (water vapor) [J/kg/K]
integer, public ks
start point of inner domain: z, local
subroutine, public prof_rapstart(rapname_base, level)
Start raptime.
integer, public ie
end point of inner domain: x, local
real(rp), public const_eps
small number
module scale_atmos_dyn_fvm_flux
subroutine, public atmos_dyn_fct(qflx_anti, phi_in, DENS0, DENS, qflx_hi, qflx_lo, mflx_hi, rdz, rdx, rdy, GSQRT, MAPF, dt, flag_vect)
Flux Correction Transport Limiter.
subroutine, public atmos_dyn_divergence(DDIV, MOMZ, MOMX, MOMY, GSQRT, J13G, J23G, J33G, MAPF, RCDZ, RCDX, RCDY, RFDZ, FDZ)
module ATMOSPHERE / Boundary treatment
subroutine, public atmos_dyn_fvm_fluxx_xyz_ud1(flux, mflx, val, GSQRT, CDZ, IIS, IIE, JJS, JJE)
calculation X-flux at XYZ
procedure(short), pointer, public atmos_dyn_tinteg_short
integer, public io_fid_log
Log file ID.
subroutine, public prof_rapend(rapname_base, level)
Save raptime.
logical, public prc_has_w
procedure(flux_phi), pointer, public atmos_dyn_fvm_fluxz_xyz
procedure(flux_phi), pointer, public atmos_dyn_fvm_fluxy_xyz
module Atmosphere / Dynamics
module scale_atmos_dyn_fvm_flux_ud1
real(rp), public atmos_boundary_smoother_fact
integer, public ja
of y whole cells (local, with HALO)