!-----------------------------------------------------------------------
!
!NCEP_MESO:MODEL_LAYER: ACCUMULATION BUCKETS
!
!-----------------------------------------------------------------------
SUBROUTINE BUCKETS(NTSD,NPREC,NSRFC,NRDSW,NRDLW & 1,11
& ,RESTART,TSTART &
& ,NCLOD,NHEAT,NPHS,TSPH &
& ,ACPREC,CUPREC,ACSNOW,ACSNOM,SSROFF,BGROFF &
& ,SFCEVP,POTEVP,SFCSHX,SFCLHX,SUBSHX,SNOPCX &
& ,SFCUVX,POTFLX &
& ,ARDSW,ASWIN,ASWOUT,ASWTOA &
& ,ARDLW,ALWIN,ALWOUT,ALWTOA &
& ,ACFRST,NCFRST,ACFRCV,NCFRCV &
& ,AVCNVC,AVRAIN,TCUCN,TRAIN &
& ,ASRFC &
& ,T,TLMAX,TLMIN,TSHLTR,PSHLTR,QSHLTR &
& ,T02_MAX,T02_MIN,RH02_MAX,RH02_MIN &
& ,IDS,IDE,JDS,JDE,KDS,KDE &
& ,IMS,IME,JMS,JME,KMS,KME &
& ,ITS,ITE,JTS,JTE,KTS,KTE)
!-----------------------------------------------------------------------
!$$$ SUBPROGRAM DOCUMENTATION BLOCK
! . . .
! SUBPROGRAM: BUCKETS EMPTY ACCUMULATION BUCKETS WHEN NEEDED
! PRGRMMR: BLACK ORG: W/NP22 DATE: 04-08-18
!
! ABSTRACT:
! VARIOUS ACCUMULATING QUANTITIES NEED TO BE RESET TO ZERO AT
! SPECIFIED INTERVALS.
!
! USAGE: CALL BUCKETS FROM SOLVE_NMM
! INPUT ARGUMENT LIST:
! NTSD - CURRENT TIMESTEP
! NPREC - NUMBER OF TIMESTEPS BETWEEN EMPTYING BUCKETS FOR PRECIP
! NHEAT - NUMBER OF TIMESTEPS BETWEEN EMPTYING BUCKETS FOR
! LATENT HEATING
! NCNVC - NUMBER OF TIMESTEPS BETWEEN CALLS TO CONVECTION
! TSPH - NUMBER OF DYNAMICS TIMESTEPS PER HOUR
! ACPREC - ACCUMULATED TOTAL PRECIPITATION (M)
! CUPREC - ACCUMULATED CONVECTIVE PRECIPITATION (M)
! ACSNOW - ACCUMULATED SNOWFALL (M)
! ACSNOM - ACCUMULATED SNOWMELT (M)
! SSROFF - ACCUMULATED SURFACE RUNOFF
! BGROFF - ACCUMULATED BELOW GROUND RUNOFF
! SFCEVP - ACCUMULATED SURFACE EVAPORATION
! POTEVP - ACCUMULATED POTENTIAL EVAPORATION
! T - TEMPERATURE
! TLMAX - MAX TEMPERATURE EACH HOUR IN LOWEST LAYER
! TLMIN - MIN TEMPERATURE EACH HOUR IN LOWEST LAYER
! TSHLTR - SHELTER LEVEL (2m) POTENTIAL TEMPERATURE (K)
! PSHLTR - SHELTER LEVEL (2m) PRESSURE (Pa)
! QSHLTR - SHELTER LEVEL (2m) SPECIFIC HUMIDITY (kg/kg)
! T02_MAX - 2m HOURLY MAX TEMPERATURE (K)
! T02_MIN - 2m HOURLY MIN TEMPERATURE (K)
! RH02_MAX - 2m HOURLY MAX RELATIVE HUMIDITY (fraction)
! RH02_MIN - 2m HOURLY MIN RELATIVE HUMIDITY (fraction)
!
! OUTPUT ARGUMENT LIST: THE ACCUMULATED QUANTITIES
!
! OUTPUT FILES: NONE
!
! SUBPROGRAMS CALLED: NONE
!
! UNIQUE: NONE
!
! LIBRARY: NONE
!
! ATTRIBUTES:
! LANGUAGE: FORTRAN 90
! MACHINE : IBM
!$$$
!-----------------------------------------------------------------------
!
USE MODULE_MODEL_CONSTANTS
,ONLY: CP,CPV,R_D,R_V,RCP
USE MODULE_MP_ETANEW
,ONLY: C1XPVS,C1XPVS0,C2XPVS,C2XPVS0 &
,FPVS,FPVS0,NX,TBPVS,TBPVS0 &
,GPVS
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
!
!-----------------------------------------------------------------------
!*** ARGUMENTS
!-----------------------------------------------------------------------
!
INTEGER,INTENT(IN) :: NCLOD,NHEAT,NPHS,NPREC,NRDLW,NRDSW &
,NSRFC,NTSD &
,IDS,IDE,JDS,JDE,KDS,KDE &
,IMS,IME,JMS,JME,KMS,KME &
,ITS,ITE,JTS,JTE,KTS,KTE
!
INTEGER,DIMENSION(IMS:IME,JMS:JME),INTENT(OUT) :: NCFRST,NCFRCV
!
REAL,INTENT(IN) :: TSPH,TSTART
!
REAL,DIMENSION(IMS:IME,JMS:JME),INTENT(IN) :: PSHLTR,QSHLTR,TSHLTR
!
REAL,DIMENSION(IMS:IME,JMS:JME,KMS:KME),INTENT(IN) :: T
!
REAL,DIMENSION(IMS:IME,JMS:JME),INTENT(INOUT) :: TLMAX,TLMIN
!
REAL,INTENT(OUT) :: ARDLW,ARDSW,ASRFC,AVCNVC,AVRAIN
!
REAL,DIMENSION(IMS:IME,JMS:JME),INTENT(OUT) :: ACPREC,ACSNOM &
& ,ACSNOW,ALWIN &
& ,ACFRST,ACFRCV &
& ,ALWOUT,ALWTOA &
& ,ASWIN,ASWOUT &
& ,ASWTOA,BGROFF &
& ,CUPREC,POTEVP &
& ,POTFLX,SFCEVP &
& ,RH02_MAX,RH02_MIN &
& ,SFCLHX,SFCSHX &
& ,SFCUVX,SNOPCX &
& ,SSROFF,SUBSHX &
& ,T02_MAX,T02_MIN
!
REAL,DIMENSION(IMS:IME,JMS:JME,KMS:KME),INTENT(OUT) :: TCUCN &
& ,TRAIN
!
LOGICAL,INTENT(IN) :: RESTART
!
!-----------------------------------------------------------------------
!*** LOCAL VARIABLES
!-----------------------------------------------------------------------
!
INTEGER :: I,J,K,NTSD_BUCKET,NTSPH
LOGICAL :: FIRST_PASS=.TRUE.
LOGICAL :: WRF_DM_ON_MONITOR
EXTERNAL WRF_DM_ON_MONITOR
!
REAL :: CAPPA_MOIST,RH02,SAT_VAPOR_PRESS,VAPOR_PRESS
REAL,SAVE :: CP_FACTOR,EPSILON,ONE_MINUS_EPSILON,R_FACTOR
REAL,SAVE :: P00_INV=1.E-5
!
REAL,DIMENSION(ITS:ITE,JTS:JTE) :: T02
!
!-----------------------------------------------------------------------
!***********************************************************************
!-----------------------------------------------------------------------
!*** COMPUTE AND SAVE THE FACTORS IN R AND CP TO ACCOUNT FOR
!*** WATER VAPOR IN THE AIR.
!***
!*** RECALL: R = Rd * (1. + Q * (1./EPSILON - 1.))
!*** CP = CPd * (1. + Q * (CPv/CPd - 1.))
!
IF(FIRST_PASS)THEN
FIRST_PASS=.FALSE.
!
EPSILON=R_D/R_V
ONE_MINUS_EPSILON=1.-EPSILON
R_FACTOR=1./EPSILON-1.
CP_FACTOR=CPV/CP-1.
! Make sure saturation vapor pressure lookup table is initialized
CALL GPVS
ENDIF
!
!-----------------------------------------------------------------------
!
NTSD_BUCKET=NTSD
!
!-----------------------------------------------------------------------
!*** TOTAL AND CONVECTIVE PRECIPITATION ARRAYS.
!*** TOTAL SNOW AND SNOW MELT ARRAYS.
!*** STORM SURFACE AND BASE GROUND RUN OFF ARRAYS.
!*** EVAPORATION ARRAYS.
!-----------------------------------------------------------------------
!
! IF(MOD(NTSD,NPREC)<NPHS)THEN
IF(MOD(NTSD_BUCKET,NPREC)==0)THEN
DO J=JTS,JTE
DO I=ITS,ITE
ACPREC(I,J)=0.
CUPREC(I,J)=0.
ACSNOW(I,J)=0.
ACSNOM(I,J)=0.
SSROFF(I,J)=0.
BGROFF(I,J)=0.
SFCEVP(I,J)=0.
POTEVP(I,J)=0.
ENDDO
ENDDO
!
IF ( WRF_DM_ON_MONITOR() ) THEN
CALL WRF_MESSAGE
('ZEROED OUT PRECIP/RUNOFF ARRAYS')
ENDIF
!
ENDIF
!
!-----------------------------------------------------------------------
!*** SFC FLUX ARRAYS.
!-----------------------------------------------------------------------
!
! IF(MOD(NTSD,NSRFC)<NPHS)THEN
IF(MOD(NTSD_BUCKET,NSRFC)==0)THEN
ASRFC=0.
DO J=JTS,JTE
DO I=ITS,ITE
SFCSHX(I,J)=0.
SFCLHX(I,J)=0.
SUBSHX(I,J)=0.
SNOPCX(I,J)=0.
SFCUVX(I,J)=0.
POTFLX(I,J)=0.
ENDDO
ENDDO
!
IF ( WRF_DM_ON_MONITOR() ) THEN
CALL WRF_MESSAGE
('ZEROED OUT SFC EVAP/FLUX ARRAYS')
ENDIF
!
ENDIF
!
!-----------------------------------------------------------------------
!*** SHORTWAVE FLUX ACCUMULATION ARRAYS.
!-----------------------------------------------------------------------
!
! IF(MOD(NTSD,NRDSW)<NPHS)THEN
IF(MOD(NTSD_BUCKET,NRDSW)==0)THEN
ARDSW=0.
DO J=JTS,JTE
DO I=ITS,ITE
ASWIN(I,J) =0.
ASWOUT(I,J)=0.
ASWTOA(I,J)=0.
ENDDO
ENDDO
!
IF ( WRF_DM_ON_MONITOR() ) THEN
CALL WRF_MESSAGE
('ZEROED OUT ACCUMULATED SHORTWAVE FLUX ARRAYS')
ENDIF
!
ENDIF
!
!-----------------------------------------------------------------------
!*** LONGWAVE FLUX ACCUMULATION ARRAYS.
!-----------------------------------------------------------------------
!
! IF(MOD(NTSD,NRDLW)<NPHS)THEN
IF(MOD(NTSD_BUCKET,NRDLW)==0)THEN
ARDLW=0.
DO J=JTS,JTE
DO I=ITS,ITE
ALWIN(I,J) =0.
ALWOUT(I,J)=0.
ALWTOA(I,J)=0.
ENDDO
ENDDO
!
IF ( WRF_DM_ON_MONITOR() ) THEN
CALL WRF_MESSAGE
('ZEROED OUT ACCUMULATED LONGWAVE FLUX ARRAYS')
ENDIF
!
ENDIF
!
!-----------------------------------------------------------------------
!*** TIME-AVERAGED CLOUD FRACTION ARRAYS.
!-----------------------------------------------------------------------
!
! IF(MOD(NTSD,NCLOD)<NPHS)THEN
IF(MOD(NTSD_BUCKET,NCLOD)==0)THEN
!***
!--- Ferrier 11/2/05: Right now no accumulator variable is used (e.g.,
! "ACLOD"), but instead the 2D arrays NCFRST & NCFRCV are used. These
! can be removed later to streamline the code.
!***
DO J=JTS,JTE
DO I=ITS,ITE
ACFRCV(I,J)=0.
ACFRST(I,J)=0.
NCFRCV(I,J)=0
NCFRST(I,J)=0
ENDDO
ENDDO
!
IF ( WRF_DM_ON_MONITOR() ) THEN
CALL WRF_MESSAGE
('ZEROED OUT ACCUMULATED CLOUD FRACTION ARRAYS')
ENDIF
!
ENDIF
!
!-----------------------------------------------------------------------
!*** GRID-SCALE AND CONVECTIVE (LATENT) HEATING ARRAYS.
!-----------------------------------------------------------------------
!
! IF(MOD(NTSD,NHEAT)<NPHS)THEN
IF(MOD(NTSD_BUCKET,NHEAT)==0)THEN
AVCNVC=0.
AVRAIN=0.
!
DO K=KTS,KTE
DO J=JTS,JTE
DO I=ITS,ITE
TRAIN(I,J,K)=0.
TCUCN(I,J,K)=0.
ENDDO
ENDDO
ENDDO
!
IF ( WRF_DM_ON_MONITOR() ) THEN
CALL WRF_MESSAGE
('ZEROED OUT ACCUMULATED LATENT HEATING ARRAYS')
ENDIF
!
ENDIF
!
!-----------------------------------------------------------------------
!*** MAX/MIN TEMPERATURES
!-----------------------------------------------------------------------
!
NTSPH=NINT(TSPH)
IF(MOD(NTSD_BUCKET,NTSPH)==0)THEN
DO J=JTS,JTE
DO I=ITS,ITE
TLMAX(I,J)=-999.
TLMIN(I,J)=999.
T02_MAX(I,J)=-999.
T02_MIN(I,J)=999.
ENDDO
ENDDO
!
IF ( WRF_DM_ON_MONITOR() ) THEN
CALL WRF_MESSAGE
('RESET MAX/MIN TEMPERATURES')
ENDIF
ENDIF
!
DO J=JTS,JTE
DO I=ITS,ITE
TLMAX(I,J)=MAX(TLMAX(I,J),T(I,J,1)) !<--- Hourly max lowest layer T
TLMIN(I,J)=MIN(TLMIN(I,J),T(I,J,1)) !<--- Hourly min lowest layer T
!
CAPPA_MOIST=RCP*(1.+QSHLTR(I,J)*R_FACTOR)/(1.+QSHLTR(I,J)*CP_FACTOR)
T02(I,J)=TSHLTR(I,J)*(P00_INV*PSHLTR(I,J))**CAPPA_MOIST
!
IF(NTSD>0)THEN
T02_MAX(I,J)=MAX(T02_MAX(I,J),T02(I,J)) !<--- Hourly max shelter T
T02_MIN(I,J)=MIN(T02_MIN(I,J),T02(I,J)) !<--- Hourly min shelter T
ENDIF
ENDDO
ENDDO
!
!-----------------------------------------------------------------------
!*** MAX/MIN RELATIVE HUMIDITY
!-----------------------------------------------------------------------
!
IF(MOD(NTSD_BUCKET,NTSPH)==0.OR.NTSD==1)THEN
DO J=JTS,JTE
DO I=ITS,ITE
RH02_MAX(I,J)=-999.
RH02_MIN(I,J)=999.
ENDDO
ENDDO
!
IF ( WRF_DM_ON_MONITOR() ) THEN
CALL WRF_MESSAGE
('RESET MAX/MIN RH')
ENDIF
ENDIF
!
IF(NTSD>0)THEN
!
DO J=JTS,JTE
DO I=ITS,ITE
VAPOR_PRESS=PSHLTR(I,J)*QSHLTR(I,J)/ &
(EPSILON+QSHLTR(I,J)*ONE_MINUS_EPSILON)
!
! IF(T02(I,J)>273.15)THEN
SAT_VAPOR_PRESS=1.E3*FPVS0(T02(I,J))
! ELSE
! SAT_VAPOR_PRESS=1.E3*FPVS(T02(I,J))
! ENDIF
!
RH02=MIN(VAPOR_PRESS/SAT_VAPOR_PRESS,0.99)
!
RH02_MAX(I,J)=MAX(RH02_MAX(I,J),RH02) !<--- Hourly max shelter RH
RH02_MIN(I,J)=MIN(RH02_MIN(I,J),RH02) !<--- Hourly min shelter RH
ENDDO
ENDDO
!
ELSE !<-- If timestep is 0, simply set max/min to zero.
DO J=JTS,JTE
DO I=ITS,ITE
RH02_MAX(I,J)=0.
RH02_MIN(I,J)=0.
ENDDO
ENDDO
!
ENDIF
!
!-----------------------------------------------------------------------
!
END SUBROUTINE BUCKETS
!
!-----------------------------------------------------------------------