1 !WRF:MEDIATION_LAYER:PHYSICS
4 MODULE module_diagnostics
6 SUBROUTINE diagnostic_output_calc( &
7 ids,ide, jds,jde, kds,kde, &
8 ims,ime, jms,jme, kms,kme, &
9 ips,ipe, jps,jpe, kps,kpe, & ! patch dims
10 i_start,i_end,j_start,j_end,kts,kte,num_tiles &
12 ,p8w,pk1m,mu_2,mu_2m &
14 ,raincv,rainncv,rainc,rainnc &
19 !----------------------------------------------------------------------
21 USE module_dm, ONLY: wrf_dm_sum_real, wrf_dm_maxval
24 !======================================================================
27 !-- DIAG_PRINT print control: 0 - no diagnostics; 1 - dmudt only; 2 - all
28 !-- DT time step (second)
29 !-- XTIME forecast time
30 !-- SBW specified boundary width - used later
32 !-- P8W 3D pressure array at full eta levels
33 !-- MU dry column hydrostatic pressure
34 !-- RAINC cumulus scheme precipitation since hour 0
35 !-- RAINCV cumulus scheme precipitation in one time step (mm)
36 !-- RAINNC explicit scheme precipitation since hour 0
37 !-- RAINNCV explicit scheme precipitation in one time step (mm)
38 !-- HFX surface sensible heat flux
39 !-- LH surface latent heat flux
40 !-- SFCEVP total surface evaporation
41 !-- U u component of wind - to be used later to compute k.e.
42 !-- V v component of wind - to be used later to compute k.e.
44 !-- ids start index for i in domain
45 !-- ide end index for i in domain
46 !-- jds start index for j in domain
47 !-- jde end index for j in domain
48 !-- kds start index for k in domain
49 !-- kde end index for k in domain
50 !-- ims start index for i in memory
51 !-- ime end index for i in memory
52 !-- jms start index for j in memory
53 !-- jme end index for j in memory
54 !-- ips start index for i in patch
55 !-- ipe end index for i in patch
56 !-- jps start index for j in patch
57 !-- jpe end index for j in patch
58 !-- kms start index for k in memory
59 !-- kme end index for k in memory
60 !-- i_start start indices for i in tile
61 !-- i_end end indices for i in tile
62 !-- j_start start indices for j in tile
63 !-- j_end end indices for j in tile
64 !-- kts start index for k in tile
65 !-- kte end index for k in tile
66 !-- num_tiles number of tiles
68 !======================================================================
70 INTEGER, INTENT(IN ) :: &
71 ids,ide, jds,jde, kds,kde, &
72 ims,ime, jms,jme, kms,kme, &
73 ips,ipe, jps,jpe, kps,kpe, &
77 INTEGER, DIMENSION(num_tiles), INTENT(IN) :: &
78 & i_start,i_end,j_start,j_end
80 INTEGER, INTENT(IN ) :: diag_print
82 REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), &
87 REAL, DIMENSION( ims:ime , jms:jme ), INTENT(IN) :: &
97 REAL, DIMENSION( ims:ime , jms:jme ), &
98 INTENT(INOUT) :: DPSDT &
103 REAL, INTENT(IN ) :: DT, XTIME
104 INTEGER, INTENT(IN ) :: SBW
108 INTEGER :: i,j,k,its,ite,jts,jte,ij
109 INTEGER :: idp,jdp,irc,jrc,irnc,jrnc,isnh,jsnh
113 REAL :: dpsdt_sum, dmudt_sum, dardt_sum, drcdt_sum, drndt_sum
114 REAL :: hfx_sum, lh_sum, sfcevp_sum, rainc_sum, rainnc_sum, raint_sum
115 REAL :: dmumax, raincmax, rainncmax, snowhmax
116 LOGICAL, EXTERNAL :: wrf_dm_on_monitor
117 CHARACTER*256 :: outstring
118 CHARACTER*6 :: grid_str
120 !-----------------------------------------------------------------
122 if (diag_print .eq. 0 ) return
124 IF ( xtime .ne. 0. ) THEN
126 if(diag_print.eq.1) then
128 ! prfreq = max(2,int(dt/60.)) ! in min
133 IF (MOD(nint(dt),prfreq) == 0) THEN
135 ! COMPUTE THE NUMBER OF MASS GRID POINTS
136 no_points = float((ide-ids)*(jde-jds))
138 ! SET START AND END POINTS FOR TILES
139 ! !$OMP PARALLEL DO &
140 ! !$OMP PRIVATE ( ij )
143 DO ij = 1 , num_tiles
145 ! print *, i_start(ij),i_end(ij),j_start(ij),j_end(ij)
146 DO j=j_start(ij),j_end(ij)
147 DO i=i_start(ij),i_end(ij)
148 dpsdt(i,j)=(p8w(i,kms,j)-pk1m(i,j))/dt
149 dmudt(i,j)=(mu_2(i,j)-mu_2m(i,j))/dt
150 if(abs(dmudt(i,j)*dt).gt.dmumax)then
151 dmumax=abs(dmudt(i,j)*dt)
159 ! !$OMP END PARALLEL DO
161 ! convert DMUMAX from (PA) to (bars) per time step
162 dmumax = dmumax*1.e-5
164 CALL wrf_dm_maxval ( dmumax, idp, jdp )
166 ! print *, 'p8w(30,1,30),pk1m(30,30) : ', p8w(30,1,30),pk1m(30,30)
167 ! print *, 'mu_2(30,30),mu_2m(30,30) : ', mu_2(30,30),mu_2m(30,30)
171 DO j = jps, min(jpe,jde-1)
172 DO i = ips, min(ipe,ide-1)
173 dpsdt_sum = dpsdt_sum + abs(dpsdt(i,j))
174 dmudt_sum = dmudt_sum + abs(dmudt(i,j))
179 dpsdt_sum = wrf_dm_sum_real ( dpsdt_sum )
180 dmudt_sum = wrf_dm_sum_real ( dmudt_sum )
182 ! print *, 'dpsdt, dmudt : ', dpsdt_sum, dmudt_sum
184 IF ( diag_print .eq. 2 ) THEN
195 DO j = jps, min(jpe,jde-1)
196 DO i = ips, min(ipe,ide-1)
197 drcdt_sum = drcdt_sum + abs(raincv(i,j))
198 drndt_sum = drndt_sum + abs(rainncv(i,j))
199 dardt_sum = dardt_sum + abs(raincv(i,j)) + abs(rainncv(i,j))
200 rainc_sum = rainc_sum + abs(rainc(i,j))
201 ! MAX for accumulated conv precip
202 IF(rainc(i,j).gt.raincmax)then
207 rainnc_sum = rainnc_sum + abs(rainnc(i,j))
208 ! MAX for accumulated resolved precip
209 IF(rainnc(i,j).gt.rainncmax)then
210 rainncmax=rainnc(i,j)
214 raint_sum = raint_sum + abs(rainc(i,j)) + abs(rainnc(i,j))
215 sfcevp_sum = sfcevp_sum + abs(sfcevp(i,j))
216 hfx_sum = hfx_sum + abs(hfx(i,j))
217 lh_sum = lh_sum + abs(lh(i,j))
222 CALL wrf_dm_maxval ( raincmax, irc, jrc )
223 CALL wrf_dm_maxval ( rainncmax, irnc, jrnc )
226 drcdt_sum = wrf_dm_sum_real ( drcdt_sum )
227 drndt_sum = wrf_dm_sum_real ( drndt_sum )
228 dardt_sum = wrf_dm_sum_real ( dardt_sum )
229 rainc_sum = wrf_dm_sum_real ( rainc_sum )
230 rainnc_sum = wrf_dm_sum_real ( rainnc_sum )
231 raint_sum = wrf_dm_sum_real ( raint_sum )
232 sfcevp_sum = wrf_dm_sum_real ( sfcevp_sum )
233 hfx_sum = wrf_dm_sum_real ( hfx_sum )
234 lh_sum = wrf_dm_sum_real ( lh_sum )
238 ! print out the average values
240 CALL get_current_grid_name( grid_str )
243 IF ( wrf_dm_on_monitor() ) THEN
245 WRITE(outstring,*) grid_str,'Domain average of dpsdt, dmudt (mb/3h): ', xtime, &
246 dpsdt_sum/no_points*108., &
247 dmudt_sum/no_points*108.
248 CALL wrf_message ( TRIM(outstring) )
250 WRITE(outstring,*) grid_str,'Max mu change time step: ', idp,jdp,dmumax
251 CALL wrf_message ( TRIM(outstring) )
253 IF ( diag_print .eq. 2) THEN
254 WRITE(outstring,*) grid_str,'Domain average of dardt, drcdt, drndt (mm/sec): ', xtime, &
255 dardt_sum/dt/no_points, &
256 drcdt_sum/dt/no_points, &
257 drndt_sum/dt/no_points
258 CALL wrf_message ( TRIM(outstring) )
259 WRITE(outstring,*) grid_str,'Domain average of rt_sum, rc_sum, rnc_sum (mm): ', xtime, &
260 raint_sum/no_points, &
261 rainc_sum/no_points, &
263 CALL wrf_message ( TRIM(outstring) )
264 WRITE(outstring,*) grid_str,'Max Accum Resolved Precip, I,J (mm): ' ,&
266 CALL wrf_message ( TRIM(outstring) )
267 WRITE(outstring,*) grid_str,'Max Accum Convective Precip, I,J (mm): ' ,&
269 CALL wrf_message ( TRIM(outstring) )
270 WRITE(outstring,*) grid_str,'Domain average of sfcevp, hfx, lh: ', xtime, &
271 sfcevp_sum/no_points, &
274 CALL wrf_message ( TRIM(outstring) )
280 ENDIF ! print frequency
283 ! save values at this time step
285 !$OMP PRIVATE ( ij,i,j )
286 DO ij = 1 , num_tiles
288 DO j=j_start(ij),j_end(ij)
289 DO i=i_start(ij),i_end(ij)
290 pk1m(i,j)=p8w(i,kms,j)
295 IF ( xtime .lt. 0.0001 ) THEN
296 DO j=j_start(ij),j_end(ij)
297 DO i=i_start(ij),i_end(ij)
305 !$OMP END PARALLEL DO
307 END SUBROUTINE diagnostic_output_calc
309 END MODULE module_diagnostics