diff --git a/modulefiles/wcoss2.lua b/modulefiles/wcoss2.lua
index 539d8581d..222078e3f 100644
--- a/modulefiles/wcoss2.lua
+++ b/modulefiles/wcoss2.lua
@@ -45,9 +45,6 @@ load(pathJoin("nemsio", nemsio_ver))
load(pathJoin("sigio", sigio_ver))
load(pathJoin("wrf_io", wrf_io_ver))
-prepend_path("MODULEPATH"," /u/wen.meng/noscrub/ncep_post/g2tmpl/libs/modulefiles/compiler/intel/19.1.3.304")
-load(pathJoin("g2tmpl", g2tmpl_ver))
-
setenv("CC","cc")
setenv("CXX","CC")
setenv("FC","ftn")
diff --git a/parm/post_avblflds.xml b/parm/post_avblflds.xml
index b2d022ee6..306b057cf 100755
--- a/parm/post_avblflds.xml
+++ b/parm/post_avblflds.xml
@@ -6996,11 +6996,10 @@
759
- AVE_SMOKE_ON_SPEC_HGT_LVL_ABOVE_GRND_8m
+ AVE_PM25_ON_SPEC_HGT_LVL_ABOVE_GRND_8m
tmpl4_46
MASSDEN
AVE
- particulate_org_matter_dry
spec_hgt_lvl_above_grnd
smaller_than_first_limit
7
@@ -7103,11 +7102,10 @@
771
- AVE_DUST_ON_SPEC_HGT_LVL_ABOVE_GRND_8m
+ AVE_PM10_ON_SPEC_HGT_LVL_ABOVE_GRND_8m
tmpl4_46
MASSDEN
AVE
- dust_dry
spec_hgt_lvl_above_grnd
8.
smaller_than_first_limit
diff --git a/parm/postxconfig-NT-rrfs.txt b/parm/postxconfig-NT-rrfs.txt
index 18b9980fa..152ff9b2c 100644
--- a/parm/postxconfig-NT-rrfs.txt
+++ b/parm/postxconfig-NT-rrfs.txt
@@ -11360,7 +11360,7 @@ surface
?
?
759
-AVE_SMOKE_ON_SPEC_HGT_LVL_ABOVE_GRND_8m
+AVE_PM25_ON_SPEC_HGT_LVL_ABOVE_GRND_8m
?
1
tmpl4_46
@@ -11377,7 +11377,7 @@ spec_hgt_lvl_above_grnd
?
0
?
-particulate_org_matter_dry
+?
?
smaller_than_first_limit
7
@@ -11402,7 +11402,7 @@ smaller_than_first_limit
?
?
771
-AVE_DUST_ON_SPEC_HGT_LVL_ABOVE_GRND_8m
+AVE_PM10_ON_SPEC_HGT_LVL_ABOVE_GRND_8m
?
1
tmpl4_46
@@ -11419,7 +11419,7 @@ spec_hgt_lvl_above_grnd
?
0
?
-dust_dry
+?
?
smaller_than_first_limit
7
diff --git a/parm/postxconfig-NT-rrfs_subh.txt b/parm/postxconfig-NT-rrfs_subh.txt
index 48e81d026..9b7643ef4 100644
--- a/parm/postxconfig-NT-rrfs_subh.txt
+++ b/parm/postxconfig-NT-rrfs_subh.txt
@@ -352,9 +352,9 @@ surface
?
?
?
-525
-BUCKET1_ASNOW_ON_SURFACE
-bucket Var density snowfall on surface
+725
+GSD_ACM_SNOD_ON_SURFACE
+?
1
tmpl4_8
ASNOW
@@ -394,9 +394,9 @@ surface
?
?
?
-526
-BUCKET1_APCP_ON_SURFACE
-bucket Total precipitation on surface
+417
+CACM_APCP_ON_SURFACE
+?
1
tmpl4_8
APCP
@@ -436,9 +436,9 @@ surface
?
?
?
-528
-BUCKET1_TSNOWP_ON_SURFACE
-bucket snow on surface
+1004
+ACM_SNOWFALL_ON_SURFACE
+?
1
tmpl4_8
TSNOWP
@@ -478,9 +478,9 @@ surface
?
?
?
-527
-BUCKET1_FRZR_ON_SURFACE
-bucket Freezing rain on surface
+782
+ACM_FRAIN_ON_SURFACE
+?
1
tmpl4_8
FRZR
@@ -520,9 +520,9 @@ surface
?
?
?
-530
-BUCKET1_GRAUPEL_ON_SURFACE
-bucket graupel precipitation on surface
+746
+ACM_GRAUPEL_ON_SURFACE
+?
1
tmpl4_8
FROZR
diff --git a/parm/rrfs_postcntrl.xml b/parm/rrfs_postcntrl.xml
index 2e4f1d145..6d47e84ee 100755
--- a/parm/rrfs_postcntrl.xml
+++ b/parm/rrfs_postcntrl.xml
@@ -1755,12 +1755,12 @@
- AVE_SMOKE_ON_SPEC_HGT_LVL_ABOVE_GRND_8m
+ AVE_PM25_ON_SPEC_HGT_LVL_ABOVE_GRND_8m
6.0
- AVE_DUST_ON_SPEC_HGT_LVL_ABOVE_GRND_8m
+ AVE_PM10_ON_SPEC_HGT_LVL_ABOVE_GRND_8m
6.0
diff --git a/parm/rrfs_postcntrl_subh.xml b/parm/rrfs_postcntrl_subh.xml
index f6bef5406..e8cb82e36 100755
--- a/parm/rrfs_postcntrl_subh.xml
+++ b/parm/rrfs_postcntrl_subh.xml
@@ -71,27 +71,27 @@
- BUCKET1_ASNOW_ON_SURFACE
+ GSD_ACM_SNOD_ON_SURFACE
9.0
- BUCKET1_APCP_ON_SURFACE
+ CACM_APCP_ON_SURFACE
-4.0
- BUCKET1_TSNOWP_ON_SURFACE
+ ACM_SNOWFALL_ON_SURFACE
6.0
- BUCKET1_FRZR_ON_SURFACE
+ ACM_FRAIN_ON_SURFACE
6.0
- BUCKET1_GRAUPEL_ON_SURFACE
+ ACM_GRAUPEL_ON_SURFACE
6.0
diff --git a/sorc/ncep_post.fd/CALPW.f b/sorc/ncep_post.fd/CALPW.f
index 90f3ebb0d..b5fa827f7 100644
--- a/sorc/ncep_post.fd/CALPW.f
+++ b/sorc/ncep_post.fd/CALPW.f
@@ -38,7 +38,6 @@
!> 2021-09-02 | Bo Cui | Decompose UPP in X direction
!> 2022-11-16 | Eric James | Adding calculation of vertically integrated dust from RRFS
!> 2023-02-23 | Eric James | Adding vertically integrated coarse PM from RRFS
-!> 2024-04-23 | Eric James | Adding vertically integrated smoke emissions (ebb)
!>
!> @author Russ Treadon W/NP2 @date 1992-12-24
!-----------------------------------------------------------------------
@@ -55,7 +54,7 @@ SUBROUTINE CALPW(PW,IDECID)
use vrbls3d, only: q, qqw, qqi, qqr, qqs, cwm, qqg, t, rswtt, &
train, tcucn, mcvg, pmid, o3, ext, pint, rlwtt, &
taod5503d,sca, asy
- use vrbls4d, only: smoke, fv3dust, coarsepm, ebb
+ use vrbls4d, only: smoke, fv3dust, coarsepm
use masks, only: htm
use params_mod, only: tfrz, gi
use ctlblk_mod, only: lm, jsta, jend, im, spval, ista, iend
@@ -298,15 +297,6 @@ SUBROUTINE CALPW(PW,IDECID)
Qdum(I,J) = COARSEPM(I,J,L,1)/(1E9)
ENDDO
END DO
-
-! EBB (from RRFS)
- ELSE IF (IDECID == 24) THEN
-!$omp parallel do private(i,j)
- DO J=JSTA,JEND
- DO I=ISTA,IEND
- Qdum(I,J) = EBB(I,J,L,1)/(1E9)
- ENDDO
- END DO
ENDIF
!
!$omp parallel do private(i,j,dp)
diff --git a/sorc/ncep_post.fd/CLDRAD.f b/sorc/ncep_post.fd/CLDRAD.f
index a323d5bff..90ff3fe43 100644
--- a/sorc/ncep_post.fd/CLDRAD.f
+++ b/sorc/ncep_post.fd/CLDRAD.f
@@ -77,6 +77,7 @@
!> 2023-09-26 | Jaymes Kenyon | For RRFS, use cloud fraction to diagnose cloud base/top (height and pressure)
!> 2024-04-23 | Eric James | Adding smoke emissions (ebb) from RRFS
!> 2024-05-01 | Jaymes Kenyon | Updates to the GSL exp-1 ceiling diagnostic
+!> 2024-05-24 | Eric James | Correcting the vertical summing of biomass burning emissions (EBB)
!>
!> @author Russ Treadon W/NP2 @date 1993-08-30
!---------------------------------------------------------------------------------
@@ -86,7 +87,7 @@
SUBROUTINE CLDRAD
!
- use vrbls4d, only: DUST,SUSO, SALT, SOOT, WASO,NO3,NH4
+ use vrbls4d, only: DUST,SUSO, SALT, SOOT, WASO,NO3,NH4,EBB
use vrbls3d, only: QQW, QQR, T, ZINT, CFR, QQI, QQS, Q, EXT, ZMID,PMID,&
PINT, DUEM, DUSD, DUDP, DUWT, DUSV, SSEM, SSSD,SSDP,&
SSWT, SSSV, BCEM, BCSD, BCDP, BCWT, BCSV, OCEM,OCSD,&
@@ -533,8 +534,20 @@ SUBROUTINE CLDRAD
! TOTAL COLUMN EBB (BIOMASS BURNING EMISSIONS)
!
IF (IGET(745) > 0) THEN
- CALL CALPW(GRID1(ista:iend,jsta:iend),24)
- CALL BOUND(GRID1,D00,H99999)
+!$omp parallel do private(i,j,ii,jj)
+ do j=1,jend-jsta+1
+ jj = jsta+j-1
+ do i=1,iend-ista+1
+ ii=ista+i-1
+ GRID1(ii,jj) = 0.0
+ do k=1,lm
+ LL=LM-k+1
+ if(EBB(ii,jj,k,1)/=spval)then
+ GRID1(ii,jj) = GRID1(ii,jj) + EBB(ii,jj,k,1)/(1E9)
+ endif
+ enddo
+ enddo
+ enddo
if(grib == "grib2" )then
cfld = cfld + 1
fld_info(cfld)%ifld = IAVBLFLD(IGET(745))
diff --git a/sorc/ncep_post.fd/SURFCE.f b/sorc/ncep_post.fd/SURFCE.f
index adba96267..e00acea44 100644
--- a/sorc/ncep_post.fd/SURFCE.f
+++ b/sorc/ncep_post.fd/SURFCE.f
@@ -52,6 +52,8 @@
!> 2024-04-03 | E James | Enabling output of hourly average smoke PM2.5 and dust PM10
!> 2024-04-23 | E James | Adding smoke emissions (ebb) from RRFS
!> 2024-05-01 | E James | Adapt the BUCKET1 type fields (15-min acc) for use in RRFS
+!> 2024-05-24 | E James | Modify the run total acc precip fields for 15-min output
+!> 2024-06-11 | E James | Modifying RRFS hourly average smoke/dust fields to be PM2.5 and PM20
!>
!> @note
!> USAGE: CALL SURFCE
@@ -482,7 +484,11 @@ SUBROUTINE SURFCE
cfld=cfld+1
fld_info(cfld)%ifld=IAVBLFLD(IGET(725))
fld_info(cfld)%ntrange=1
- fld_info(cfld)%tinvstat=IFHR
+ if(ifmin>1)then
+ fld_info(cfld)%tinvstat=IFHR*60+IFMIN
+ else
+ fld_info(cfld)%tinvstat=IFHR
+ endif
!$omp parallel do private(i,j,ii,jj)
do j=1,jend-jsta+1
jj = jsta+j-1
@@ -2211,14 +2217,14 @@ SUBROUTINE SURFCE
endif
ENDIF
!
-! Hourly averaged surface smoke
+! Hourly averaged surface PM2.5
!
IF (IGET(759)>0) THEN
GRID1=SPVAL
DO J=JSTA,JEND
DO I=ISTA,IEND
if(T(I,J,LM)/=spval.and.PMID(I,J,LM)/=spval.and.SMOKE_AVE(I,J)/=spval)&
- GRID1(I,J) = (1./RD)*(PMID(I,J,LM)/T(I,J,LM))*SMOKE_AVE(I,J)/(1E9)
+ GRID1(I,J) = (1./RD)*(PMID(I,J,LM)/T(I,J,LM))*(SMOKE_AVE(I,J)+DUST_AVE(I,J))/(1E9)
ENDDO
ENDDO
ID(1:25) = 0
@@ -2259,7 +2265,7 @@ SUBROUTINE SURFCE
DO J=JSTA,JEND
DO I=ISTA,IEND
if(T(I,J,LM)/=spval.and.PMID(I,J,LM)/=spval.and.DUST_AVE(I,J)/=spval)&
- GRID1(I,J) = (1./RD)*(PMID(I,J,LM)/T(I,J,LM))*(DUST_AVE(I,J)+COARSEPM_AVE(I,J))/(1E9)
+ GRID1(I,J) = (1./RD)*(PMID(I,J,LM)/T(I,J,LM))*(SMOKE_AVE(I,J)+DUST_AVE(I,J)+COARSEPM_AVE(I,J))/(1E9)
ENDDO
ENDDO
ID(1:25) = 0
@@ -3128,7 +3134,7 @@ SUBROUTINE SURFCE
DO J=JSTA,JEND
DO I=ISTA,IEND
IF(AVGPREC_CONT(I,J) < SPVAL)THEN
- GRID2(I,J) = AVGPREC_CONT(I,J)*FLOAT(IFHR)*3600.*1000./DTQ2
+ GRID2(I,J) = AVGPREC_CONT(I,J)*((3600.*FLOAT(IFHR))+(60.*FLOAT(IFMIN)))*1000./DTQ2
ELSE
GRID2(I,J) = SPVAL
END IF
@@ -3142,7 +3148,11 @@ SUBROUTINE SURFCE
cfld=cfld+1
fld_info(cfld)%ifld=IAVBLFLD(IGET(417))
fld_info(cfld)%ntrange=1
- fld_info(cfld)%tinvstat=IFHR
+ if(ifmin>1)then
+ fld_info(cfld)%tinvstat=IFHR*60+IFMIN
+ else
+ fld_info(cfld)%tinvstat=IFHR
+ endif
! print*,'tinvstat in cont bucket= ',fld_info(cfld)%tinvstat
!$omp parallel do private(i,j,ii,jj)
do j=1,jend-jsta+1
@@ -3572,8 +3582,15 @@ SUBROUTINE SURFCE
cfld=cfld+1
fld_info(cfld)%ifld=IAVBLFLD(IGET(746))
fld_info(cfld)%ntrange=1
- fld_info(cfld)%tinvstat=IFHR-ID(18)
- if(MODELNAME=='FV3R' .OR. MODELNAME=='GFS')fld_info(cfld)%tinvstat=IFHR
+ if(MODELNAME=='FV3R' .OR. MODELNAME=='GFS')then
+ if(ifmin>1)then
+ fld_info(cfld)%tinvstat=IFHR*60+IFMIN
+ else
+ fld_info(cfld)%tinvstat=IFHR
+ endif
+ else
+ fld_info(cfld)%tinvstat=IFHR-ID(18)
+ endif
!$omp parallel do private(i,j,ii,jj)
do j=1,jend-jsta+1
jj = jsta+j-1
@@ -3618,8 +3635,15 @@ SUBROUTINE SURFCE
cfld=cfld+1
fld_info(cfld)%ifld=IAVBLFLD(IGET(782))
fld_info(cfld)%ntrange=1
- fld_info(cfld)%tinvstat=IFHR-ID(18)
- if(MODELNAME=='FV3R' .OR. MODELNAME=='GFS')fld_info(cfld)%tinvstat=IFHR
+ if(MODELNAME=='FV3R' .OR. MODELNAME=='GFS')then
+ if(ifmin>1)then
+ fld_info(cfld)%tinvstat=IFHR*60+IFMIN
+ else
+ fld_info(cfld)%tinvstat=IFHR
+ endif
+ else
+ fld_info(cfld)%tinvstat=IFHR-ID(18)
+ endif
!$omp parallel do private(i,j,ii,jj)
do j=1,jend-jsta+1
jj = jsta+j-1
@@ -3664,8 +3688,15 @@ SUBROUTINE SURFCE
cfld=cfld+1
fld_info(cfld)%ifld=IAVBLFLD(IGET(1004))
fld_info(cfld)%ntrange=1
- fld_info(cfld)%tinvstat=IFHR-ID(18)
- if(MODELNAME=='FV3R' .or. MODELNAME=='GFS')fld_info(cfld)%tinvstat=IFHR
+ if(MODELNAME=='FV3R' .OR. MODELNAME=='GFS')then
+ if(ifmin>1)then
+ fld_info(cfld)%tinvstat=IFHR*60+IFMIN
+ else
+ fld_info(cfld)%tinvstat=IFHR
+ endif
+ else
+ fld_info(cfld)%tinvstat=IFHR-ID(18)
+ endif
! print*,'id(18),tinvstat in acgraup= ',ID(18),fld_info(cfld)%tinvstat
!$omp parallel do private(i,j,ii,jj)
do j=1,jend-jsta+1
diff --git a/sorc/ncep_post.fd/grib2_module.f b/sorc/ncep_post.fd/grib2_module.f
index 3481bcb68..25f80c9c0 100644
--- a/sorc/ncep_post.fd/grib2_module.f
+++ b/sorc/ncep_post.fd/grib2_module.f
@@ -85,7 +85,7 @@ module grib2_module
integer num_pset
integer isec,hrs_obs_cutoff,min_obs_cutoff
integer sec_intvl,stat_miss_val,time_inc_betwn_succ_fld
- integer perturb_num,num_ens_fcst
+ integer perturb_num,num_ens_fcst,prob_num,tot_num_prob
character*80 type_of_time_inc,stat_unit_time_key_succ
logical*1,allocatable :: bmap(:)
integer ibm
@@ -165,7 +165,9 @@ subroutine grib_info_init()
type_of_time_inc='same_start_time_fcst_fcst_time_inc'
stat_unit_time_key_succ='missing'
time_inc_betwn_succ_fld=0
-!
+ prob_num = 0
+ tot_num_prob = 1
+ !
!-- open fld name tble
!
if(first_grbtbl) then
@@ -505,8 +507,8 @@ subroutine gengrb2msg(idisc,icatg, iparm,nprm,nlvl,fldlvl1,fldlvl2,ntrange,tinvs
!use gdtsec3, only: getgdtnum
implicit none
!
- integer,intent(in) :: idisc,icatg, iparm,nprm,fldlvl1,fldlvl2,ntrange,tinvstat
- integer,intent(inout) :: nlvl
+ integer,intent(in) :: idisc,icatg, iparm,nprm,fldlvl1,fldlvl2,ntrange
+ integer,intent(inout) :: nlvl,tinvstat
real,dimension(:),intent(in) :: datafld1
character(1),intent(inout) :: cgrib(max_bytes)
integer, intent(inout) :: lengrib
@@ -548,7 +550,6 @@ subroutine gengrb2msg(idisc,icatg, iparm,nprm,nlvl,fldlvl1,fldlvl2,ntrange,tinvs
integer scaled_val_fixed_sfc1,scale_fct_fixed_sfc2
character(80) fixed_sfc2_type
integer idec_scl,ibin_scl,ibmap,inumbits
- integer prob_num,tot_num_prob
character(80) prob_type
real fldscl
integer igdstmpl(igdsmaxlen)
@@ -763,6 +764,9 @@ subroutine gengrb2msg(idisc,icatg, iparm,nprm,nlvl,fldlvl1,fldlvl2,ntrange,tinvs
if((modelname=='RAPR'.and.vtimeunits=='FMIN').or.(modelname=='FV3R'.and.pset%time_range_unit=="minute")) then
ifhrorig = ifhr
ifhr = ifhr*60 + ifmin
+ if(ifmin<1)then
+ tinvstat = tinvstat*60 + ifmin
+ endif
ihr_start = max(0,ifhr-tinvstat)
else
if(ifmin > 0.)then ! change time range unit to minute
diff --git a/sorc/ncep_post.fd/io_int_stubs.f b/sorc/ncep_post.fd/io_int_stubs.f
index f6dc98c30..98e894fcc 100644
--- a/sorc/ncep_post.fd/io_int_stubs.f
+++ b/sorc/ncep_post.fd/io_int_stubs.f
@@ -2,12 +2,6 @@
!
!--- get_dom_ti_real
SUBROUTINE ext_int_get_dom_ti_real ( DataHandle,Element, Data, Count, Outcount, Status )
- INTEGER , INTENT(IN) :: DataHandle
- CHARACTER*(*) :: Element
- REAL , INTENT(OUT) :: Data(*)
- INTEGER , INTENT(IN) :: Count
- INTEGER , INTENT(OUT) :: Outcount
- INTEGER , INTENT(OUT) :: Status
RETURN
END SUBROUTINE ext_int_get_dom_ti_real