!WRF:MEDIATION_LAYER:PHYSICS
!
MODULE module_diagnostics 2
CONTAINS
SUBROUTINE diagnostic_output_calc( & 1,13
ids,ide, jds,jde, kds,kde, &
ims,ime, jms,jme, kms,kme, &
ips,ipe, jps,jpe, kps,kpe, & ! patch dims
i_start,i_end,j_start,j_end,kts,kte,num_tiles &
,dpsdt,dmudt &
,p8w,pk1m,mu_2,mu_2m &
,u,v &
,raincv,rainncv,rainc,rainnc &
,i_rainc,i_rainnc &
,hfx,sfcevp,lh &
,ACSWUPT,ACSWUPTC,ACSWDNT,ACSWDNTC & ! Optional
,ACSWUPB,ACSWUPBC,ACSWDNB,ACSWDNBC & ! Optional
,ACLWUPT,ACLWUPTC,ACLWDNT,ACLWDNTC & ! Optional
,ACLWUPB,ACLWUPBC,ACLWDNB,ACLWDNBC & ! Optional
,I_ACSWUPT,I_ACSWUPTC,I_ACSWDNT,I_ACSWDNTC & ! Optional
,I_ACSWUPB,I_ACSWUPBC,I_ACSWDNB,I_ACSWDNBC & ! Optional
,I_ACLWUPT,I_ACLWUPTC,I_ACLWDNT,I_ACLWDNTC & ! Optional
,I_ACLWUPB,I_ACLWUPBC,I_ACLWDNB,I_ACLWDNBC & ! Optional
,dt,xtime,sbw,t2 &
,diag_print &
,bucket_mm, bucket_J &
,prec_acc_c, prec_acc_nc, snow_acc_nc &
,snowncv, prec_acc_dt, curr_secs &
,nwp_diagnostics, diagflag &
,history_interval &
,itimestep &
,u10,v10,w &
,wspd10max &
,up_heli_max &
,w_up_max,w_dn_max &
,znw,w_colmean &
,numcolpts,w_mean &
,grpl_max,grpl_colint,refd_max,refl_10cm &
,qg_curr &
,rho,ph,phb,g &
)
!----------------------------------------------------------------------
USE module_dm
, ONLY: wrf_dm_sum_real, wrf_dm_maxval
IMPLICIT NONE
!======================================================================
! Definitions
!-----------
!-- DIAG_PRINT print control: 0 - no diagnostics; 1 - dmudt only; 2 - all
!-- DT time step (second)
!-- XTIME forecast time
!-- SBW specified boundary width - used later
!
!-- P8W 3D pressure array at full eta levels
!-- MU dry column hydrostatic pressure
!-- RAINC cumulus scheme precipitation since hour 0
!-- RAINCV cumulus scheme precipitation in one time step (mm)
!-- RAINNC explicit scheme precipitation since hour 0
!-- RAINNCV explicit scheme precipitation in one time step (mm)
!-- SNOWNCV explicit scheme snow in one time step (mm)
!-- HFX surface sensible heat flux
!-- LH surface latent heat flux
!-- SFCEVP total surface evaporation
!-- U u component of wind - to be used later to compute k.e.
!-- V v component of wind - to be used later to compute k.e.
!-- PREC_ACC_C accumulated convective precip over accumulation time prec_acc_dt
!-- PREC_ACC_NC accumulated explicit precip over accumulation time prec_acc_dt
!-- SNOW_ACC_NC accumulated explicit snow precip over accumulation time prec_acc_dt
!-- PREC_ACC_DT precip accumulation time, default is 60 min
!-- CURR_SECS model time in seconds
!-- NWP_DIAGNOSTICS = 1, compute hourly maximum fields
!-- DIAGFLAG logical flag to indicate if this is a history output time
!-- U10, V10 10 m wind components
!-- WSPD10MAX 10 m max wind speed
!-- UP_HELI_MAX max updraft helicity
!-- W_UP_MAX max updraft vertical velocity
!-- W_DN_MAX max downdraft vertical velocity
!-- W_COLMEAN column mean vertical velocity
!-- NUMCOLPTS no of column points
!-- GRPL_MAX max column-integrated graupel
!-- GRPL_COLINT column-integrated graupel
!-- REF_MAX max derived radar reflectivity
!-- REFL_10CM model computed 3D reflectivity
!
!-- ids start index for i in domain
!-- ide end index for i in domain
!-- jds start index for j in domain
!-- jde end index for j in domain
!-- kds start index for k in domain
!-- kde end index for k in domain
!-- ims start index for i in memory
!-- ime end index for i in memory
!-- jms start index for j in memory
!-- jme end index for j in memory
!-- ips start index for i in patch
!-- ipe end index for i in patch
!-- jps start index for j in patch
!-- jpe end index for j in patch
!-- kms start index for k in memory
!-- kme end index for k in memory
!-- i_start start indices for i in tile
!-- i_end end indices for i in tile
!-- j_start start indices for j in tile
!-- j_end end indices for j in tile
!-- kts start index for k in tile
!-- kte end index for k in tile
!-- num_tiles number of tiles
!
!======================================================================
INTEGER, INTENT(IN ) :: &
ids,ide, jds,jde, kds,kde, &
ims,ime, jms,jme, kms,kme, &
ips,ipe, jps,jpe, kps,kpe, &
kts,kte, &
num_tiles
INTEGER, DIMENSION(num_tiles), INTENT(IN) :: &
& i_start,i_end,j_start,j_end
INTEGER, INTENT(IN ) :: diag_print
REAL, INTENT(IN ) :: bucket_mm, bucket_J
INTEGER, INTENT(IN ) :: nwp_diagnostics
LOGICAL, INTENT(IN ) :: diagflag
REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), &
INTENT(IN ) :: u &
, v &
, p8w
REAL, DIMENSION( ims:ime , jms:jme ), INTENT(IN) :: &
MU_2 &
, RAINNCV &
, RAINCV &
, SNOWNCV &
, HFX &
, LH &
, SFCEVP &
, T2
REAL, DIMENSION( ims:ime , jms:jme ), &
INTENT(INOUT) :: DPSDT &
, DMUDT &
, RAINNC &
, RAINC &
, MU_2M &
, PK1M
REAL, INTENT(IN ) :: DT, XTIME
INTEGER, INTENT(IN ) :: SBW
INTEGER, DIMENSION( ims:ime , jms:jme ), INTENT(INOUT) :: &
I_RAINC, &
I_RAINNC
REAL, DIMENSION( ims:ime, jms:jme ), OPTIONAL, INTENT(INOUT) ::&
ACSWUPT,ACSWUPTC,ACSWDNT,ACSWDNTC, &
ACSWUPB,ACSWUPBC,ACSWDNB,ACSWDNBC, &
ACLWUPT,ACLWUPTC,ACLWDNT,ACLWDNTC, &
ACLWUPB,ACLWUPBC,ACLWDNB,ACLWDNBC
INTEGER, DIMENSION( ims:ime, jms:jme ), OPTIONAL, INTENT(INOUT) ::&
I_ACSWUPT,I_ACSWUPTC,I_ACSWDNT,I_ACSWDNTC, &
I_ACSWUPB,I_ACSWUPBC,I_ACSWDNB,I_ACSWDNBC, &
I_ACLWUPT,I_ACLWUPTC,I_ACLWDNT,I_ACLWDNTC, &
I_ACLWUPB,I_ACLWUPBC,I_ACLWDNB,I_ACLWDNBC
REAL, DIMENSION( ims:ime, jms:jme ), OPTIONAL, INTENT(INOUT) ::&
PREC_ACC_C, PREC_ACC_NC, SNOW_ACC_NC
REAL, OPTIONAL, INTENT(IN):: PREC_ACC_DT, CURR_SECS
INTEGER :: i,j,k,its,ite,jts,jte,ij
INTEGER :: idp,jdp,irc,jrc,irnc,jrnc,isnh,jsnh
INTEGER :: prfreq
REAL :: no_points
REAL :: dpsdt_sum, dmudt_sum, dardt_sum, drcdt_sum, drndt_sum
REAL :: hfx_sum, lh_sum, sfcevp_sum, rainc_sum, rainnc_sum, raint_sum
REAL :: dmumax, raincmax, rainncmax, snowhmax
LOGICAL, EXTERNAL :: wrf_dm_on_monitor
CHARACTER*256 :: outstring
CHARACTER*6 :: grid_str
INTEGER, INTENT(IN) :: &
history_interval,itimestep
REAL, DIMENSION( kms:kme ), INTENT(IN) :: &
znw
REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(IN) :: &
w &
,qg_curr &
,rho &
,refl_10cm &
,ph,phb
REAL, DIMENSION( ims:ime, jms:jme ), INTENT(IN) :: &
u10 &
,v10
REAL, INTENT(IN) :: g
REAL, DIMENSION( ims:ime , jms:jme ), INTENT(INOUT) :: &
wspd10max &
,up_heli_max &
,w_up_max,w_dn_max &
,w_colmean,numcolpts,w_mean &
,grpl_max,grpl_colint &
,refd_max
INTEGER :: idump
REAL :: wind_vel
REAL :: depth
!-----------------------------------------------------------------
! Handle accumulations with buckets to prevent round-off truncation in long runs
! This is done every 360 minutes assuming time step fits exactly into 360 minutes
IF(bucket_mm .gt. 0. .AND. MOD(NINT(XTIME),360) .EQ. 0)THEN
! SET START AND END POINTS FOR TILES
! !$OMP PARALLEL DO &
! !$OMP PRIVATE ( ij )
DO ij = 1 , num_tiles
IF (xtime .eq. 0.0)THEN
DO j=j_start(ij),j_end(ij)
DO i=i_start(ij),i_end(ij)
i_rainnc(i,j) = 0
i_rainc(i,j) = 0
ENDDO
ENDDO
ENDIF
DO j=j_start(ij),j_end(ij)
DO i=i_start(ij),i_end(ij)
IF(rainnc(i,j) .gt. bucket_mm)THEN
rainnc(i,j) = rainnc(i,j) - bucket_mm
i_rainnc(i,j) = i_rainnc(i,j) + 1
ENDIF
IF(rainc(i,j) .gt. bucket_mm)THEN
rainc(i,j) = rainc(i,j) - bucket_mm
i_rainc(i,j) = i_rainc(i,j) + 1
ENDIF
ENDDO
ENDDO
IF (xtime .eq. 0.0 .and. bucket_J .gt. 0.0 .and. PRESENT(ACSWUPT))THEN
DO j=j_start(ij),j_end(ij)
DO i=i_start(ij),i_end(ij)
i_acswupt(i,j) = 0
i_acswuptc(i,j) = 0
i_acswdnt(i,j) = 0
i_acswdntc(i,j) = 0
i_acswupb(i,j) = 0
i_acswupbc(i,j) = 0
i_acswdnb(i,j) = 0
i_acswdnbc(i,j) = 0
ENDDO
ENDDO
ENDIF
IF (xtime .eq. 0.0 .and. bucket_J .gt. 0.0 .and. PRESENT(ACLWUPT))THEN
DO j=j_start(ij),j_end(ij)
DO i=i_start(ij),i_end(ij)
i_aclwupt(i,j) = 0
i_aclwuptc(i,j) = 0
i_aclwdnt(i,j) = 0
i_aclwdntc(i,j) = 0
i_aclwupb(i,j) = 0
i_aclwupbc(i,j) = 0
i_aclwdnb(i,j) = 0
i_aclwdnbc(i,j) = 0
ENDDO
ENDDO
ENDIF
IF (PRESENT(ACSWUPT) .and. bucket_J .gt. 0.0)THEN
DO j=j_start(ij),j_end(ij)
DO i=i_start(ij),i_end(ij)
IF(acswupt(i,j) .gt. bucket_J)THEN
acswupt(i,j) = acswupt(i,j) - bucket_J
i_acswupt(i,j) = i_acswupt(i,j) + 1
ENDIF
IF(acswuptc(i,j) .gt. bucket_J)THEN
acswuptc(i,j) = acswuptc(i,j) - bucket_J
i_acswuptc(i,j) = i_acswuptc(i,j) + 1
ENDIF
IF(acswdnt(i,j) .gt. bucket_J)THEN
acswdnt(i,j) = acswdnt(i,j) - bucket_J
i_acswdnt(i,j) = i_acswdnt(i,j) + 1
ENDIF
IF(acswdntc(i,j) .gt. bucket_J)THEN
acswdntc(i,j) = acswdntc(i,j) - bucket_J
i_acswdntc(i,j) = i_acswdntc(i,j) + 1
ENDIF
IF(acswupb(i,j) .gt. bucket_J)THEN
acswupb(i,j) = acswupb(i,j) - bucket_J
i_acswupb(i,j) = i_acswupb(i,j) + 1
ENDIF
IF(acswupbc(i,j) .gt. bucket_J)THEN
acswupbc(i,j) = acswupbc(i,j) - bucket_J
i_acswupbc(i,j) = i_acswupbc(i,j) + 1
ENDIF
IF(acswdnb(i,j) .gt. bucket_J)THEN
acswdnb(i,j) = acswdnb(i,j) - bucket_J
i_acswdnb(i,j) = i_acswdnb(i,j) + 1
ENDIF
IF(acswdnbc(i,j) .gt. bucket_J)THEN
acswdnbc(i,j) = acswdnbc(i,j) - bucket_J
i_acswdnbc(i,j) = i_acswdnbc(i,j) + 1
ENDIF
ENDDO
ENDDO
ENDIF
IF (PRESENT(ACLWUPT) .and. bucket_J .gt. 0.0)THEN
DO j=j_start(ij),j_end(ij)
DO i=i_start(ij),i_end(ij)
IF(aclwupt(i,j) .gt. bucket_J)THEN
aclwupt(i,j) = aclwupt(i,j) - bucket_J
i_aclwupt(i,j) = i_aclwupt(i,j) + 1
ENDIF
IF(aclwuptc(i,j) .gt. bucket_J)THEN
aclwuptc(i,j) = aclwuptc(i,j) - bucket_J
i_aclwuptc(i,j) = i_aclwuptc(i,j) + 1
ENDIF
IF(aclwdnt(i,j) .gt. bucket_J)THEN
aclwdnt(i,j) = aclwdnt(i,j) - bucket_J
i_aclwdnt(i,j) = i_aclwdnt(i,j) + 1
ENDIF
IF(aclwdntc(i,j) .gt. bucket_J)THEN
aclwdntc(i,j) = aclwdntc(i,j) - bucket_J
i_aclwdntc(i,j) = i_aclwdntc(i,j) + 1
ENDIF
IF(aclwupb(i,j) .gt. bucket_J)THEN
aclwupb(i,j) = aclwupb(i,j) - bucket_J
i_aclwupb(i,j) = i_aclwupb(i,j) + 1
ENDIF
IF(aclwupbc(i,j) .gt. bucket_J)THEN
aclwupbc(i,j) = aclwupbc(i,j) - bucket_J
i_aclwupbc(i,j) = i_aclwupbc(i,j) + 1
ENDIF
IF(aclwdnb(i,j) .gt. bucket_J)THEN
aclwdnb(i,j) = aclwdnb(i,j) - bucket_J
i_aclwdnb(i,j) = i_aclwdnb(i,j) + 1
ENDIF
IF(aclwdnbc(i,j) .gt. bucket_J)THEN
aclwdnbc(i,j) = aclwdnbc(i,j) - bucket_J
i_aclwdnbc(i,j) = i_aclwdnbc(i,j) + 1
ENDIF
ENDDO
ENDDO
ENDIF
ENDDO
! !$OMP END PARALLEL DO
ENDIF
! Compute precipitation accumulation in a given time window: prec_acc_dt
IF (prec_acc_dt .gt. 0.) THEN
! !$OMP PARALLEL DO &
! !$OMP PRIVATE ( ij )
DO ij = 1 , num_tiles
DO j=j_start(ij),j_end(ij)
DO i=i_start(ij),i_end(ij)
IF (mod(curr_secs, 60.* prec_acc_dt) == 0.) THEN
prec_acc_c(i,j) = 0.
prec_acc_nc(i,j) = 0.
snow_acc_nc(i,j) = 0.
ENDIF
prec_acc_c(i,j) = prec_acc_c(i,j) + RAINCV(i,j)
prec_acc_nc(i,j) = prec_acc_nc(i,j) + RAINNCV(i,j)
prec_acc_c(i,j) = MAX (prec_acc_c(i,j), 0.0)
prec_acc_nc(i,j) = MAX (prec_acc_nc(i,j), 0.0)
snow_acc_nc(i,j) = snow_acc_nc(i,j) + SNOWNCV(I,J)
! add convective precip to snow bucket if t2 < 273.15
IF ( t2(i,j) .lt. 273.15 ) THEN
snow_acc_nc(i,j) = snow_acc_nc(i,j) + RAINCV(i,j)
snow_acc_nc(i,j) = MAX (snow_acc_nc(i,j), 0.0)
ENDIF
ENDDO
ENDDO
ENDDO
! !$OMP END PARALLEL DO
ENDIF
! NSSL
IF ( nwp_diagnostics .EQ. 1 ) THEN
idump = (history_interval * 60.) / dt
! print *,' history_interval = ', history_interval
! print *,' itimestep = ', itimestep
! print *,' idump = ', idump
! print *,' xtime = ', xtime
! IF ( MOD(itimestep, idump) .eq. 0 ) THEN
! WRITE(outstring,*) 'Computing PH0 for this domain with curr_secs = ', curr_secs
! CALL wrf_message ( TRIM(outstring) )
IF ( MOD((itimestep - 1), idump) .eq. 0 ) THEN
WRITE(outstring,*) 'NSSL Diagnostics: Resetting max arrays for domain with dt = ', dt
CALL wrf_debug
( 10,TRIM(outstring) )
! !$OMP PARALLEL DO &
! !$OMP PRIVATE ( ij )
DO ij = 1 , num_tiles
DO j=j_start(ij),j_end(ij)
DO i=i_start(ij),i_end(ij)
wspd10max(i,j) = 0.
up_heli_max(i,j) = 0.
w_up_max(i,j) = 0.
w_dn_max(i,j) = 0.
w_mean(i,j) = 0.
grpl_max(i,j) = 0.
refd_max(i,j) = 0.
ENDDO
ENDDO
ENDDO
! !$OMP END PARALLEL DO
ENDIF
! !$OMP PARALLEL DO &
! !$OMP PRIVATE ( ij )
DO ij = 1 , num_tiles
DO j=j_start(ij),j_end(ij)
DO i=i_start(ij),i_end(ij)
! Zero some accounting arrays that will be used below
w_colmean(i,j) = 0.
numcolpts(i,j) = 0.
grpl_colint(i,j) = 0.
ENDDO
ENDDO
ENDDO
! !$OMP END PARALLEL DO
! !$OMP PARALLEL DO &
! !$OMP PRIVATE ( ij )
DO ij = 1 , num_tiles
DO j=j_start(ij),j_end(ij)
DO k=kms,kme
DO i=i_start(ij),i_end(ij)
! Find vertical velocity max (up and down) below 400 mb
IF ( p8w(i,k,j) .GT. 40000. .AND. w(i,k,j) .GT. w_up_max(i,j) ) THEN
w_up_max(i,j) = w(i,k,j)
ENDIF
IF ( p8w(i,k,j) .GT. 40000. .AND. w(i,k,j) .LT. w_dn_max(i,j) ) THEN
w_dn_max(i,j) = w(i,k,j)
ENDIF
! For the column mean vertical velocity calculation, first
! total the vertical velocity between sigma levels 0.5 and 0.8
IF ( znw(k) .GE. 0.5 .AND. znw(k) .LE. 0.8 ) THEN
w_colmean(i,j) = w_colmean(i,j) + w(i,k,j)
numcolpts(i,j) = numcolpts(i,j) + 1
ENDIF
ENDDO
ENDDO
ENDDO
ENDDO
! !$OMP END PARALLEL DO
! !$OMP PARALLEL DO &
! !$OMP PRIVATE ( ij )
DO ij = 1 , num_tiles
DO j=j_start(ij),j_end(ij)
DO k=kms,kme-1
DO i=i_start(ij),i_end(ij)
! Calculate the column integrated graupel
depth = ( ( ph(i,k+1,j) + phb(i,k+1,j) ) / g ) - \
( ( ph(i,k ,j) + phb(i,k ,j) ) / g )
grpl_colint(i,j) = grpl_colint(i,j) + qg_curr(i,k,j) * depth * rho(i,k,j)
ENDDO
ENDDO
ENDDO
ENDDO
! !$OMP END PARALLEL DO
! !$OMP PARALLEL DO &
! !$OMP PRIVATE ( ij )
DO ij = 1 , num_tiles
DO j=j_start(ij),j_end(ij)
DO i=i_start(ij),i_end(ij)
! Calculate the max 10 m wind speed between output times
wind_vel = sqrt ( u10(i,j)*u10(i,j) + v10(i,j)*v10(i,j) )
IF ( wind_vel .GT. wspd10max(i,j) ) THEN
wspd10max(i,j) = wind_vel
ENDIF
! Calculate the column mean vertical velocity between output times
w_mean(i,j) = w_mean(i,j) + w_colmean(i,j) / numcolpts(i,j)
IF ( MOD(itimestep, idump) .eq. 0 ) THEN
w_mean(i,j) = w_mean(i,j) / idump
ENDIF
! Calculate the max column integrated graupel between output times
IF ( grpl_colint(i,j) .gt. grpl_max(i,j) ) THEN
grpl_max(i,j) = grpl_colint(i,j)
ENDIF
! Calculate the max radar reflectivity between output times
IF ( refl_10cm(i,kms,j) .GT. refd_max(i,j) ) THEN
refd_max(i,j) = refl_10cm(i,kms,j)
ENDIF
ENDDO
ENDDO
ENDDO
! !$OMP END PARALLEL DO
ENDIF
! NSSL
if (diag_print .eq. 0 ) return
IF ( xtime .ne. 0. ) THEN
if(diag_print.eq.1) then
prfreq = dt
! prfreq = max(2,int(dt/60.)) ! in min
else
prfreq=10 ! in min
endif
IF (MOD(nint(dt),prfreq) == 0) THEN
! COMPUTE THE NUMBER OF MASS GRID POINTS
no_points = float((ide-ids)*(jde-jds))
! SET START AND END POINTS FOR TILES
! !$OMP PARALLEL DO &
! !$OMP PRIVATE ( ij )
dmumax = 0.
DO ij = 1 , num_tiles
! print *, i_start(ij),i_end(ij),j_start(ij),j_end(ij)
DO j=j_start(ij),j_end(ij)
DO i=i_start(ij),i_end(ij)
dpsdt(i,j)=(p8w(i,kms,j)-pk1m(i,j))/dt
dmudt(i,j)=(mu_2(i,j)-mu_2m(i,j))/dt
if(abs(dmudt(i,j)*dt).gt.dmumax)then
dmumax=abs(dmudt(i,j)*dt)
idp=i
jdp=j
endif
ENDDO
ENDDO
ENDDO
! !$OMP END PARALLEL DO
! convert DMUMAX from (PA) to (bars) per time step
dmumax = dmumax*1.e-5
! compute global MAX
CALL wrf_dm_maxval
( dmumax, idp, jdp )
! print *, 'p8w(30,1,30),pk1m(30,30) : ', p8w(30,1,30),pk1m(30,30)
! print *, 'mu_2(30,30),mu_2m(30,30) : ', mu_2(30,30),mu_2m(30,30)
dpsdt_sum = 0.
dmudt_sum = 0.
DO j = jps, min(jpe,jde-1)
DO i = ips, min(ipe,ide-1)
dpsdt_sum = dpsdt_sum + abs(dpsdt(i,j))
dmudt_sum = dmudt_sum + abs(dmudt(i,j))
ENDDO
ENDDO
! compute global sum
dpsdt_sum = wrf_dm_sum_real ( dpsdt_sum )
dmudt_sum = wrf_dm_sum_real ( dmudt_sum )
! print *, 'dpsdt, dmudt : ', dpsdt_sum, dmudt_sum
IF ( diag_print .eq. 2 ) THEN
dardt_sum = 0.
drcdt_sum = 0.
drndt_sum = 0.
rainc_sum = 0.
raint_sum = 0.
rainnc_sum = 0.
sfcevp_sum = 0.
hfx_sum = 0.
lh_sum = 0.
raincmax = 0.
rainncmax = 0.
DO j = jps, min(jpe,jde-1)
DO i = ips, min(ipe,ide-1)
drcdt_sum = drcdt_sum + abs(raincv(i,j))
drndt_sum = drndt_sum + abs(rainncv(i,j))
dardt_sum = dardt_sum + abs(raincv(i,j)) + abs(rainncv(i,j))
rainc_sum = rainc_sum + abs(rainc(i,j))
! MAX for accumulated conv precip
IF(rainc(i,j).gt.raincmax)then
raincmax=rainc(i,j)
irc=i
jrc=j
ENDIF
rainnc_sum = rainnc_sum + abs(rainnc(i,j))
! MAX for accumulated resolved precip
IF(rainnc(i,j).gt.rainncmax)then
rainncmax=rainnc(i,j)
irnc=i
jrnc=j
ENDIF
raint_sum = raint_sum + abs(rainc(i,j)) + abs(rainnc(i,j))
sfcevp_sum = sfcevp_sum + abs(sfcevp(i,j))
hfx_sum = hfx_sum + abs(hfx(i,j))
lh_sum = lh_sum + abs(lh(i,j))
ENDDO
ENDDO
! compute global MAX
CALL wrf_dm_maxval
( raincmax, irc, jrc )
CALL wrf_dm_maxval
( rainncmax, irnc, jrnc )
! compute global sum
drcdt_sum = wrf_dm_sum_real ( drcdt_sum )
drndt_sum = wrf_dm_sum_real ( drndt_sum )
dardt_sum = wrf_dm_sum_real ( dardt_sum )
rainc_sum = wrf_dm_sum_real ( rainc_sum )
rainnc_sum = wrf_dm_sum_real ( rainnc_sum )
raint_sum = wrf_dm_sum_real ( raint_sum )
sfcevp_sum = wrf_dm_sum_real ( sfcevp_sum )
hfx_sum = wrf_dm_sum_real ( hfx_sum )
lh_sum = wrf_dm_sum_real ( lh_sum )
ENDIF
! print out the average values
CALL get_current_grid_name
( grid_str )
#ifdef DM_PARALLEL
IF ( wrf_dm_on_monitor() ) THEN
#endif
WRITE(outstring,*) grid_str,'Domain average of dpsdt, dmudt (mb/3h): ', xtime, &
dpsdt_sum/no_points*108., &
dmudt_sum/no_points*108.
CALL wrf_message
( TRIM(outstring) )
WRITE(outstring,*) grid_str,'Max mu change time step: ', idp,jdp,dmumax
CALL wrf_message
( TRIM(outstring) )
IF ( diag_print .eq. 2) THEN
WRITE(outstring,*) grid_str,'Domain average of dardt, drcdt, drndt (mm/sec): ', xtime, &
dardt_sum/dt/no_points, &
drcdt_sum/dt/no_points, &
drndt_sum/dt/no_points
CALL wrf_message
( TRIM(outstring) )
WRITE(outstring,*) grid_str,'Domain average of rt_sum, rc_sum, rnc_sum (mm): ', xtime, &
raint_sum/no_points, &
rainc_sum/no_points, &
rainnc_sum/no_points
CALL wrf_message
( TRIM(outstring) )
WRITE(outstring,*) grid_str,'Max Accum Resolved Precip, I,J (mm): ' ,&
rainncmax,irnc,jrnc
CALL wrf_message
( TRIM(outstring) )
WRITE(outstring,*) grid_str,'Max Accum Convective Precip, I,J (mm): ' ,&
raincmax,irc,jrc
CALL wrf_message
( TRIM(outstring) )
WRITE(outstring,*) grid_str,'Domain average of sfcevp, hfx, lh: ', xtime, &
sfcevp_sum/no_points, &
hfx_sum/no_points, &
lh_sum/no_points
CALL wrf_message
( TRIM(outstring) )
ENDIF
#ifdef DM_PARALLEL
ENDIF
#endif
ENDIF ! print frequency
ENDIF
! save values at this time step
!$OMP PARALLEL DO &
!$OMP PRIVATE ( ij,i,j )
DO ij = 1 , num_tiles
DO j=j_start(ij),j_end(ij)
DO i=i_start(ij),i_end(ij)
pk1m(i,j)=p8w(i,kms,j)
mu_2m(i,j)=mu_2(i,j)
ENDDO
ENDDO
IF ( xtime .lt. 0.0001 ) THEN
DO j=j_start(ij),j_end(ij)
DO i=i_start(ij),i_end(ij)
dpsdt(i,j)=0.
dmudt(i,j)=0.
ENDDO
ENDDO
ENDIF
ENDDO
!$OMP END PARALLEL DO
END SUBROUTINE diagnostic_output_calc
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
SUBROUTINE clwrf_output_calc( & 1,13
ids,ide, jds,jde, kds,kde, &
ims,ime, jms,jme, kms,kme, &
ips,ipe, jps,jpe, kps,kpe, & ! patch dims
i_start,i_end,j_start,j_end,kts,kte,num_tiles &
,dpsdt,dmudt &
,p8w,pk1m,mu_2,mu_2m &
,u,v &
,is_restart & ! CLWRF
,clwrfH,t2,q2,u10,v10, skintemp & ! CLWRF
,t2clmin,t2clmax,tt2clmin,tt2clmax & ! CLWRF
,t2clmean,t2clstd & ! CLWRF
,q2clmin,q2clmax,tq2clmin,tq2clmax & ! CLWRF
,q2clmean,q2clstd & ! CLWRF
,u10clmax,v10clmax,spduv10clmax,tspduv10clmax & ! CLWRF
,u10clmean,v10clmean,spduv10clmean & ! CLWRF
,u10clstd,v10clstd,spduv10clstd & ! CLWRF
,raincclmax,rainncclmax,traincclmax,trainncclmax & ! CLWRF
,raincclmean,rainncclmean,raincclstd,rainncclstd & ! CLWRF
,skintempclmin,skintempclmax & ! CLWRF
,tskintempclmin,tskintempclmax & ! CLWRF
,skintempclmean,skintempclstd & ! CLWRF
,raincv,rainncv,rainc,rainnc &
,i_rainc,i_rainnc &
,hfx,sfcevp,lh &
,dt,xtime,sbw &
,diag_print &
,bucket_mm, bucket_J &
)
!----------------------------------------------------------------------
USE module_dm
, ONLY: wrf_dm_sum_real, wrf_dm_maxval
USE module_configure
IMPLICIT NONE
!======================================================================
! Definitions
!-----------
!-- DT time step (second)
!-- XTIME forecast time
!-- SBW specified boundary width - used later
!
!-- P8W 3D pressure array at full eta levels
!-- MU dry column hydrostatic pressure
!-- RAINC cumulus scheme precipitation since hour 0
!-- RAINCV cumulus scheme precipitation in one time step (mm)
!-- RAINNC explicit scheme precipitation since hour 0
!-- RAINNCV explicit scheme precipitation in one time step (mm)
!-- HFX surface sensible heat flux
!-- LH surface latent heat flux
!-- SFCEVP total surface evaporation
!-- U u component of wind - to be used later to compute k.e.
!-- V v component of wind - to be used later to compute k.e.
!
!-- ids start index for i in domain
!-- ide end index for i in domain
!-- jds start index for j in domain
!-- jde end index for j in domain
!-- kds start index for k in domain
!-- kde end index for k in domain
!-- ims start index for i in memory
!-- ime end index for i in memory
!-- jms start index for j in memory
!-- jme end index for j in memory
!-- ips start index for i in patch
!-- ipe end index for i in patch
!-- jps start index for j in patch
!-- jpe end index for j in patch
!-- kms start index for k in memory
!-- kme end index for k in memory
!-- i_start start indices for i in tile
!-- i_end end indices for i in tile
!-- j_start start indices for j in tile
!-- j_end end indices for j in tile
!-- kts start index for k in tile
!-- kte end index for k in tile
!-- num_tiles number of tiles
!
! CLWRF-UC May.09 definitions
!-----------
! is_restart: whether if simulation is a restart
! clwrfH: Interval (hour) of accumulation for computations
! [var]cl[min/max]: [minimum/maximum] of variable [var] during interval
! t[var]cl[min/max]: Time (minutes) of [minimum/maximum] of variable
! [var] during interval
! [var]clmean: mean of variable [var] during interval
! [var]clstd: standard dev. of variable [var] during interval
! Variables are written on aux_hist_out7 (established
! in Registry)
!
!======================================================================
INTEGER, INTENT(IN ) :: &
ids,ide, jds,jde, kds,kde, &
ims,ime, jms,jme, kms,kme, &
ips,ipe, jps,jpe, kps,kpe, &
kts,kte, &
num_tiles
INTEGER, DIMENSION(num_tiles), INTENT(IN) :: i_start, &
i_end,j_start,j_end
INTEGER, INTENT(IN ) :: diag_print
REAL, INTENT(IN ) :: bucket_mm, &
bucket_J
REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), &
INTENT(IN ) :: u,v,p8w
REAL, DIMENSION( ims:ime , jms:jme ), INTENT(IN) :: MU_2, &
RAINNCV, RAINCV, HFX, &
SFCEVP, LH, SKINTEMP
REAL, DIMENSION( ims:ime , jms:jme ), &
INTENT(INOUT) :: DPSDT, &
DMUDT, RAINNC, RAINC, &
MU_2M, PK1M
REAL, INTENT(IN ) :: DT, XTIME
INTEGER, INTENT(IN ) :: SBW
INTEGER, DIMENSION( ims:ime , jms:jme ), &
INTENT(INOUT) :: I_RAINC, &
I_RAINNC
! LOCAL VAR
INTEGER :: i,j,k,its,ite,jts,jte,ij
INTEGER :: idp,jdp,irc,jrc,irnc,jrnc,isnh,jsnh
INTEGER :: prfreq
REAL :: dpsdt_sum, dmudt_sum, dardt_sum, &
drcdt_sum, drndt_sum
REAL :: hfx_sum, lh_sum, sfcevp_sum, &
rainc_sum, rainnc_sum, raint_sum
REAL :: dmumax, raincmax, rainncmax, &
snowhmax
REAL :: xtimep
LOGICAL, EXTERNAL :: wrf_dm_on_monitor
CHARACTER*256 :: outstring
CHARACTER*6 :: grid_str
!!-------------------
!! CLWRF-UC Nov.09
CHARACTER (LEN=80) :: timestr
REAL, DIMENSION( ims:ime , jms:jme ), &
INTENT(IN) :: t2, q2, u10, v10
REAL, DIMENSION( ims:ime , jms:jme ), &
INTENT(OUT) :: t2clmin, t2clmax, tt2clmin, &
tt2clmax, t2clmean, t2clstd, &
q2clmin, q2clmax, tq2clmin, tq2clmax, q2clmean, q2clstd,&
u10clmax, v10clmax, spduv10clmax, tspduv10clmax, &
u10clmean, v10clmean, spduv10clmean, &
u10clstd, v10clstd, spduv10clstd, skintempclmin, &
skintempclmax, tskintempclmin, tskintempclmax, &
skintempclmean, skintempclstd
REAL, DIMENSION( ims:ime , jms:jme ), &
INTENT(OUT) :: raincclmax, rainncclmax, &
traincclmax, trainncclmax, raincclmean, rainncclmean, &
raincclstd, rainncclstd
REAL, PARAMETER :: minimum0= 1000000., &
maximum0= -1000000.
REAL :: value
INTEGER, INTENT(IN) :: clwrfH
CHARACTER (LEN=1024) :: message
REAL, SAVE :: nsteps
LOGICAL :: is_restart
!-----------------------------------------------------------------
! Compute minutes from reference times clwrfH
! Initialize [var] values
! SET START AND END POINTS FOR TILES
! !$OMP PARALLEL DO &
! !$OMP PRIVATE ( ij )
! IF ( MOD(NINT(XTIME), clwrfH) == 0 ) THEN
IF (( MOD(NINT(XTIME/dt*60.),NINT(clwrfH/dt*60.)) == 0) .AND. (.NOT.is_restart)) THEN
DO ij = 1 , num_tiles
IF ( wrf_dm_on_monitor() ) THEN
WRITE(message, *)'CLWRFdiag - T2; tile: ',ij,' T2clmin:', &
t2clmin(i_start(ij)+(i_end(ij)-i_start(ij))/2, &
j_start(ij)+(j_end(ij)-j_start(ij))/2),' T2clmax:', &
t2clmax(i_start(ij)+(i_end(ij)-i_start(ij))/2, &
j_start(ij)+(j_end(ij)-j_start(ij))/2),' TT2clmin:', &
tt2clmin(i_start(ij)+(i_end(ij)-i_start(ij))/2, &
j_start(ij)+(j_end(ij)-j_start(ij))/2),' TT2clmax:', &
tt2clmax(i_start(ij)+(i_end(ij)-i_start(ij))/2, &
j_start(ij)+(j_end(ij)-j_start(ij))/2),' T2clmean:', &
t2clmean(i_start(ij)+(i_end(ij)-i_start(ij))/2, &
j_start(ij)+(j_end(ij)-j_start(ij))/2),' T2clstd:', &
t2clstd(i_start(ij)+(i_end(ij)-i_start(ij))/2, &
j_start(ij)+(j_end(ij)-j_start(ij))/2)
CALL wrf_debug
(75, message)
WRITE(message, *)'CLWRFdiag - Q2; tile: ',ij,' Q2clmin:', &
q2clmin(i_start(ij)+(i_end(ij)-i_start(ij))/2, &
j_start(ij)+(j_end(ij)-j_start(ij))/2),' Q2clmax:', &
q2clmax(i_start(ij)+(i_end(ij)-i_start(ij))/2, &
j_start(ij)+(j_end(ij)-j_start(ij))/2),' TQ2clmin:', &
tq2clmin(i_start(ij)+(i_end(ij)-i_start(ij))/2, &
j_start(ij)+(j_end(ij)-j_start(ij))/2),' TQ2clmax:', &
tq2clmax(i_start(ij)+(i_end(ij)-i_start(ij))/2, &
j_start(ij)+(j_end(ij)-j_start(ij))/2),' Q2clmean:', &
q2clmean(i_start(ij)+(i_end(ij)-i_start(ij))/2, &
j_start(ij)+(j_end(ij)-j_start(ij))/2),' Q2clstd:', &
q2clstd(i_start(ij)+(i_end(ij)-i_start(ij))/2, &
j_start(ij)+(j_end(ij)-j_start(ij))/2)
CALL wrf_debug
(75, message)
WRITE(message, *)'CLWRFdiag - WINDSPEED; tile: ',ij,' U10clmax:', &
u10clmax(i_start(ij)+(i_end(ij)-i_start(ij))/2, &
j_start(ij)+(j_end(ij)-j_start(ij))/2),' V10clmax:', &
v10clmax(i_start(ij)+(i_end(ij)-i_start(ij))/2, &
j_start(ij)+(j_end(ij)-j_start(ij))/2),' SPDUV10clmax:', &
spduv10clmax(i_start(ij)+(i_end(ij)-i_start(ij))/2, &
j_start(ij)+(j_end(ij)-j_start(ij))/2),' TSPDUV10clmax:', &
tspduv10clmax(i_start(ij)+(i_end(ij)-i_start(ij))/2, &
j_start(ij)+(j_end(ij)-j_start(ij))/2),' U10clmean:', &
u10clmean(i_start(ij)+(i_end(ij)-i_start(ij))/2, &
j_start(ij)+(j_end(ij)-j_start(ij))/2),' V10clmean:', &
v10clmean(i_start(ij)+(i_end(ij)-i_start(ij))/2, &
j_start(ij)+(j_end(ij)-j_start(ij))/2),' SPDUV10clmean:', &
spduv10clmean(i_start(ij)+(i_end(ij)-i_start(ij))/2, &
j_start(ij)+(j_end(ij)-j_start(ij))/2),' U10clstd:', &
u10clstd(i_start(ij)+(i_end(ij)-i_start(ij))/2, &
j_start(ij)+(j_end(ij)-j_start(ij))/2),' V10clstd:', &
v10clstd(i_start(ij)+(i_end(ij)-i_start(ij))/2, &
j_start(ij)+(j_end(ij)-j_start(ij))/2),' SPDUV10clstd:', &
spduv10clstd(i_start(ij)+(i_end(ij)-i_start(ij))/2, &
j_start(ij)+(j_end(ij)-j_start(ij))/2)
CALL wrf_debug
(75, message)
WRITE(message, *)'CLWRFdiag - RAIN; tile: ',ij,' RAINCclmax:', &
raincclmax(i_start(ij)+(i_end(ij)-i_start(ij))/2, &
j_start(ij)+(j_end(ij)-j_start(ij))/2),' RAINNCclmax:', &
rainncclmax(i_start(ij)+(i_end(ij)-i_start(ij))/2, &
j_start(ij)+(j_end(ij)-j_start(ij))/2),' TRAINCclmax:', &
traincclmax(i_start(ij)+(i_end(ij)-i_start(ij))/2, &
j_start(ij)+(j_end(ij)-j_start(ij))/2),' TRAINNCclmax:', &
trainncclmax(i_start(ij)+(i_end(ij)-i_start(ij))/2, &
j_start(ij)+(j_end(ij)-j_start(ij))/2),' RAINCclmean:', &
raincclmean(i_start(ij)+(i_end(ij)-i_start(ij))/2, &
j_start(ij)+(j_end(ij)-j_start(ij))/2),' RAINNCclmean:', &
rainncclmean(i_start(ij)+(i_end(ij)-i_start(ij))/2, &
j_start(ij)+(j_end(ij)-j_start(ij))/2),' RAINCclstd:', &
raincclstd(i_start(ij)+(i_end(ij)-i_start(ij))/2, &
j_start(ij)+(j_end(ij)-j_start(ij))/2),' RAINNCclstd:', &
rainncclstd(i_start(ij)+(i_end(ij)-i_start(ij))/2, &
j_start(ij)+(j_end(ij)-j_start(ij))/2)
CALL wrf_debug
(75, message)
WRITE(message,*)'CLWRFdiag - SKINTEMP; tile: ',ij,' SKINTEMPclmin:',&
skintempclmin(i_start(ij)+(i_end(ij)-i_start(ij))/2, &
j_start(ij)+(j_end(ij)-j_start(ij))/2),' SKINTEMPclmax:', &
skintempclmax(i_start(ij)+(i_end(ij)-i_start(ij))/2, &
j_start(ij)+(j_end(ij)-j_start(ij))/2),' TSKINTEMPclmin:', &
tskintempclmin(i_start(ij)+(i_end(ij)-i_start(ij))/2, &
j_start(ij)+(j_end(ij)-j_start(ij))/2),' TSKINTEMPclmax:', &
tskintempclmax(i_start(ij)+(i_end(ij)-i_start(ij))/2, &
j_start(ij)+(j_end(ij)-j_start(ij))/2),' SKINTEMPclmean:', &
skintempclmean(i_start(ij)+(i_end(ij)-i_start(ij))/2, &
j_start(ij)+(j_end(ij)-j_start(ij))/2),' SKINTEMPclstd:', &
skintempclstd(i_start(ij)+(i_end(ij)-i_start(ij))/2, &
j_start(ij)+(j_end(ij)-j_start(ij))/2)
CALL wrf_debug
(75, message)
ENDIF
DO j = j_start(ij), j_end(ij)
DO i = i_start(ij), i_end(ij)
t2clmin(i,j)=t2(i,j)
t2clmax(i,j)=t2(i,j)
t2clmean(i,j)=t2(i,j)
t2clstd(i,j)=t2(i,j)*t2(i,j)
q2clmin(i,j)=q2(i,j)
q2clmax(i,j)=q2(i,j)
q2clmean(i,j)=q2(i,j)
q2clstd(i,j)=q2(i,j)*q2(i,j)
spduv10clmax(i,j)=sqrt(u10(i,j)*u10(i,j)+v10(i,j)*v10(i,j))
u10clmean(i,j)=u10(i,j)
v10clmean(i,j)=v10(i,j)
spduv10clmean(i,j)=sqrt(u10(i,j)*u10(i,j)+v10(i,j)*v10(i,j))
u10clstd(i,j)=u10(i,j)*u10(i,j)
v10clstd(i,j)=v10(i,j)*v10(i,j)
spduv10clstd(i,j)=u10(i,j)*u10(i,j)+v10(i,j)*v10(i,j)
raincclmax(i,j)=raincv(i,j)/dt
rainncclmax(i,j)=rainncv(i,j)/dt
raincclmean(i,j)=raincv(i,j)/dt
rainncclmean(i,j)=rainncv(i,j)/dt
raincclstd(i,j)=(raincv(i,j)/dt)*(raincv(i,j)/dt)
rainncclstd(i,j)=(rainncv(i,j)/dt)*(rainncv(i,j)/dt)
skintempclmin(i,j)=skintemp(i,j)
skintempclmax(i,j)=skintemp(i,j)
skintempclmean(i,j)=skintemp(i,j)
skintempclstd(i,j)=skintemp(i,j)*skintemp(i,j)
! nsteps=0.
ENDDO
ENDDO
ENDDO
nsteps=clwrfH*60./dt
ELSE
xtimep = xtime + dt/60. ! value at end of timestep for time info
! nsteps=nsteps+1.
nsteps=clwrfH*60./dt
! DO j = j_start(ij), j_end(ij)
! DO i = i_start(ij), i_end(ij)
! DO j = jps, jpe
! DO i = ips, ipe
! Temperature
CALL varstatistics
(t2,xtimep,ime-ims+1,jme-jms+1,t2clmin,t2clmax, &
tt2clmin,tt2clmax,t2clmean,t2clstd)
! Water vapor mixing ratio
CALL varstatistics
(q2,xtimep,ime-ims+1,jme-jms+1,q2clmin,q2clmax, &
tq2clmin,tq2clmax,q2clmean,q2clstd)
! Wind speed
CALL varstatisticsWIND
(u10,v10,xtimep,ime-ims+1,jme-jms+1,u10clmax, &
v10clmax,spduv10clmax,tspduv10clmax,u10clmean,v10clmean, &
spduv10clmean,u10clstd,v10clstd,spduv10clstd)
! Precipitation flux
CALL varstatisticsMAX
(raincv/dt,xtimep,ime-ims+1,jme-jms+1, &
raincclmax,traincclmax,raincclmean,raincclstd)
CALL varstatisticsMAX
(rainncv/dt,xtimep,ime-ims+1,jme-jms+1, &
rainncclmax,trainncclmax,rainncclmean,rainncclstd)
! Skin Temperature
CALL varstatistics
(skintemp,xtimep,ime-ims+1,jme-jms+1,skintempclmin,&
skintempclmax, tskintempclmin,tskintempclmax,skintempclmean, &
skintempclstd)
! IF (MOD(NINT(XTIME),clwrfH) == 0) THEN
! IF (MOD(NINT(XTIME+dt/60.),clwrfH) == 0) THEN
IF ((MOD(NINT((XTIME+dt/60.)*60./dt),NINT(clwrfH*60./dt)) == 0)) THEN
IF ( wrf_dm_on_monitor() ) PRINT *,'nsteps=',nsteps,' xtime:', &
xtime,' clwrfH:',clwrfH
t2clmean=t2clmean/nsteps
t2clstd=SQRT(t2clstd/nsteps-t2clmean**2.)
q2clmean=q2clmean/nsteps
q2clstd=SQRT(q2clstd/nsteps-q2clmean**2.)
u10clmean=u10clmean/nsteps
v10clmean=v10clmean/nsteps
spduv10clmean=spduv10clmean/nsteps
u10clstd=SQRT(u10clstd/nsteps-u10clmean**2.)
v10clstd=SQRT(v10clstd/nsteps-v10clmean**2.)
spduv10clstd=SQRT(spduv10clstd/nsteps- &
spduv10clmean**2)
raincclmean=raincclmean/nsteps
rainncclmean=rainncclmean/nsteps
raincclstd=SQRT(raincclstd/nsteps-raincclmean**2.)
rainncclstd=SQRT(rainncclstd/nsteps-rainncclmean**2.)
skintempclmean=skintempclmean/nsteps
skintempclstd=SQRT(skintempclstd/nsteps-skintempclmean**2.)
END IF
! ENDDO
! ENDDO
ENDIF
! !$OMP END PARALLEL DO
END SUBROUTINE clwrf_output_calc
! UC.CLWRF Nov.09
SUBROUTINE varstatisticsWIND(varu, varv, tt, dx, dy, varumax, varvmax, & 1
varuvmax, tvaruvmax, varumean, varvmean, varuvmean, varustd, varvstd, &
varuvstd)
! Subroutine to compute variable statistics for a wind somponents
IMPLICIT NONE
INTEGER :: i, j
INTEGER, INTENT(IN) :: dx, dy
REAL, DIMENSION(dx,dy), INTENT(IN) :: varu, varv
REAL, INTENT(IN) :: tt
REAL, DIMENSION(dx,dy), INTENT(INOUT) :: varumax, &
varvmax, varuvmax, tvaruvmax, varumean, varvmean, varuvmean, varustd, &
varvstd, varuvstd
REAL :: varuv
DO i=1,dx
DO j=1,dy
varuv=sqrt(varu(i,j)*varu(i,j)+varv(i,j)*varv(i,j))
IF (varuv > varuvmax(i,j)) THEN
varumax(i,j)=varu(i,j)
varvmax(i,j)=varv(i,j)
varuvmax(i,j)=varuv
tvaruvmax(i,j)=tt
END IF
varuvmean(i,j)=varuvmean(i,j)+varuv
varuvstd(i,j)=varuvstd(i,j)+varuv**2
END DO
END DO
varumean=varumean+varu
varvmean=varvmean+varv
varustd=varustd+varu**2
varvstd=varvstd+varv**2
END SUBROUTINE varstatisticsWIND
SUBROUTINE varstatisticsMAX(var, tt, dx, dy, varmax, tvarmax, varmean, & 2
varstd)
! Subroutine to compute variable statistics for a max only variable values
IMPLICIT NONE
INTEGER :: i,j
INTEGER, INTENT(IN) :: dx, dy
REAL, DIMENSION(dx,dy), INTENT(IN) :: var
REAL, INTENT(IN) :: tt
REAL, DIMENSION(dx,dy), INTENT(INOUT) :: varmax, &
tvarmax, varmean, varstd
DO i=1,dx
DO j=1,dy
IF (var(i,j) > varmax(i,j)) THEN
varmax(i,j)=var(i,j)
tvarmax(i,j)=tt
END IF
END DO
END DO
varmean=varmean+var
varstd=varstd+var**2
END SUBROUTINE varstatisticsMAX
SUBROUTINE varstatistics(var, tt, dx, dy, varmin, varmax, tvarmin, tvarmax, & 3
varmean, varstd)
! Subroutine to compute variable statistics
IMPLICIT NONE
INTEGER :: i,j
INTEGER, INTENT(IN) :: dx, dy
REAL, DIMENSION(dx,dy), INTENT(IN) :: var
REAL, INTENT(IN) :: tt
REAL, DIMENSION(dx,dy), INTENT(INOUT) :: varmin, &
varmax, tvarmin, tvarmax, varmean, varstd
DO i=1,dx
DO j=1,dy
IF (var(i,j) < varmin(i,j)) THEN
varmin(i,j)=var(i,j)
tvarmin(i,j)=tt
END IF
IF (var(i,j) > varmax(i,j)) THEN
varmax(i,j)=var(i,j)
tvarmax(i,j)=tt
END IF
END DO
END DO
varmean=varmean+var
varstd=varstd+var**2
END SUBROUTINE varstatistics
SUBROUTINE pld ( u,v,w,t,qv,zp,zb,pp,pb,p,pw, & 2,1
msfux,msfuy,msfvx,msfvy,msftx,msfty, &
f,e, &
use_tot_or_hyd_p,missing, &
num_press_levels,max_press_levels,press_levels, &
p_pl,u_pl,v_pl,t_pl,rh_pl,ght_pl,s_pl,td_pl, &
ids,ide, jds,jde, kds,kde, &
ims,ime, jms,jme, kms,kme, &
its,ite, jts,jte, kts,kte )
USE module_model_constants
IMPLICIT NONE
! Input variables
INTEGER, INTENT(IN ) :: ids,ide, jds,jde, kds,kde, &
ims,ime, jms,jme, kms,kme, &
its,ite, jts,jte, kts,kte
REAL , INTENT(IN ) , DIMENSION(ims:ime , jms:jme) :: msfux,msfuy,msfvx,msfvy,msftx,msfty, &
f,e
INTEGER, INTENT(IN ) :: use_tot_or_hyd_p
REAL , INTENT(IN ) :: missing
REAL , INTENT(IN ) , DIMENSION(ims:ime , kms:kme , jms:jme) :: u,v,w,t,qv,zp,zb,pp,pb,p,pw
INTEGER, INTENT(IN ) :: num_press_levels, max_press_levels
REAL , INTENT(IN ) , DIMENSION(max_press_levels) :: press_levels
! Output variables
REAL , INTENT( OUT) , DIMENSION(num_press_levels) :: p_pl
REAL , INTENT( OUT) , DIMENSION(ims:ime , num_press_levels , jms:jme) :: u_pl,v_pl,t_pl,rh_pl,ght_pl,s_pl,td_pl
! Local variables
REAL, PARAMETER :: eps = 0.622, t_kelvin = svpt0 , s1 = 243.5, s2 = svp2 , s3 = svp1*10., s4 = 611.0, s5 = 5418.12
INTEGER :: i, j, ke, kp, ke_h, ke_f
REAL :: pu, pd, pm , &
tu, td , &
su, sd , &
uu, ud , &
vu, vd , &
zu, zd , &
qu, qd, qm , &
eu, ed, em , &
du, dd
REAL :: es, qs
! Silly, but transfer the small namelist.input array into the grid structure for output purposes.
DO kp = 1 , num_press_levels
p_pl(kp) = press_levels(kp)
END DO
! Initialize pressure level data to un-initialized
DO j = jts , jte
DO kp = 1 , num_press_levels
DO i = its , ite
u_pl (i,kp,j) = missing
v_pl (i,kp,j) = missing
t_pl (i,kp,j) = missing
rh_pl (i,kp,j) = missing
ght_pl(i,kp,j) = missing
s_pl (i,kp,j) = missing
td_pl (i,kp,j) = missing
END DO
END DO
END DO
! Loop over each i,j location
j_loop : DO j = jts , MIN(jte,jde-1)
i_loop : DO i = its , MIN(ite,ide-1)
! For each i,j location, loop over the selected pressure levels to find
ke_h = kts
ke_f = kts
kp_loop : DO kp = 1 , num_press_levels
! For this particular i,j and pressure level, find the eta levels that surround this point
! on half-levels.
ke_loop_half : DO ke = ke_h , kte-2
IF ( use_tot_or_hyd_p .EQ. 1 ) THEN ! total pressure
pu = pp(i,ke+1,j)+pb(i,ke+1,j)
pd = pp(i,ke ,j)+pb(i,ke ,j)
ELSE IF ( use_tot_or_hyd_p .EQ. 2 ) THEN ! hydrostatic pressure
pu = p(i,ke+1,j)
pd = p(i,ke ,j)
END IF
pm = p_pl(kp)
IF ( ( pd .GE. pm ) .AND. &
( pu .LT. pm ) ) THEN
! Found trapping pressure: up, middle, down. We are doing first order interpolation.
! Now we just put in a list of diagnostics for this level.
! 1. Temperature (K)
tu = (t(i,ke+1,j)+t0)*(pu/p1000mb)**rcp
td = (t(i,ke ,j)+t0)*(pd/p1000mb)**rcp
t_pl(i,kp,j) = ( tu * (pm-pd) + td * (pu-pm) ) / (pu-pd)
! 2. Speed (m s-1)
su = 0.5 * SQRT ( ( u(i,ke+1,j)+u(i+1,ke+1,j) )**2 + ( v(i,ke+1,j)+v(i,ke+1,j+1) )**2 )
sd = 0.5 * SQRT ( ( u(i,ke ,j)+u(i+1,ke ,j) )**2 + ( v(i,ke ,j)+v(i,ke ,j+1) )**2 )
s_pl(i,kp,j) = ( su * (pm-pd) + sd * (pu-pm) ) / (pu-pd)
! 3. U and V (m s-1)
uu = 0.5 * ( u(i,ke+1,j)+u(i+1,ke+1,j) )
ud = 0.5 * ( u(i,ke ,j)+u(i+1,ke ,j) )
u_pl(i,kp,j) = ( uu * (pm-pd) + ud * (pu-pm) ) / (pu-pd)
vu = 0.5 * ( v(i,ke+1,j)+v(i,ke+1,j+1) )
vd = 0.5 * ( v(i,ke ,j)+v(i,ke ,j+1) )
v_pl(i,kp,j) = ( vu * (pm-pd) + vd * (pu-pm) ) / (pu-pd)
! 4. Dewpoint (K) - Use Bolton's approximation
qu = MAX(qv(i,ke+1,j),0.)
qd = MAX(qv(i,ke ,j),0.)
eu = qu * pu * 0.01 / ( eps + qu ) ! water vapor pressure in mb.
ed = qd * pd * 0.01 / ( eps + qd ) ! water vapor pressure in mb.
eu = max(eu, 0.001)
ed = max(ed, 0.001)
du = t_kelvin + ( s1 / ((s2 / log(eu/s3)) - 1.0) )
dd = t_kelvin + ( s1 / ((s2 / log(ed/s3)) - 1.0) )
td_pl(i,kp,j) = ( du * (pm-pd) + dd * (pu-pm) ) / (pu-pd)
! 5. Relative humidity (%)
qm = ( qu * (pm-pd) + qd * (pu-pm) ) / (pu-pd) ! qvapor at the pressure level.
es = s4 * exp(s5 * (1.0 / 273.0 - 1.0 / t_pl(i,kp,j)))
qs = eps * es / (pm - es)
rh_pl(i,kp,j) = qm / qs * 100.
!em = qm * pm * 0.01 / ( eps + qm ) ! water vapor pressure at the level.
!es = s3 * exp( s2 * (t_pl(i,kp,j) - t_kelvin)/(t_pl(i,kp,j) - s4) ) ! sat vapor pressure over liquid water in mb.
!rh_pl(i,kp,j) = 100. * em * ( pm * 0.01 - es ) / ( es * ( pm * 0.01 - em ) )
ke_h = ke
EXIT ke_loop_half
END IF
END DO ke_loop_half
ke_loop_full : DO ke = ke_f , kte-1
IF ( ( pw(i,ke ,j) .GE. p_pl(kp) ) .AND. &
( pw(i,ke+1,j) .LT. p_pl(kp) ) ) THEN
! Found trapping pressure: up, middle, down. We are doing first order interpolation.
pu = LOG(pw(i,ke+1,j))
pm = LOG(p_pl(kp))
pd = LOG(pw(i,ke ,j))
! Now we just put in a list of diagnostics for this level.
! 1. Geopotential height (m)
zu = ( zp(i,ke+1,j)+zb(i,ke+1,j) ) / g
zd = ( zp(i,ke ,j)+zb(i,ke ,j) ) / g
ght_pl(i,kp,j) = ( zu * (pm-pd) + zd * (pu-pm) ) / (pu-pd)
ke_f = ke
EXIT ke_loop_full
END IF
END DO ke_loop_full
END DO kp_loop
END DO i_loop
END DO j_loop
END SUBROUTINE pld
END MODULE module_diagnostics