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