diff --git a/parm/README.make_flatfile b/parm/README.make_flatfile
index a38db9ab6..e7befc1e5 100644
--- a/parm/README.make_flatfile
+++ b/parm/README.make_flatfile
@@ -6,14 +6,14 @@ To make a .txt flat file for UPP, follow these steps within the parm/ directory:
2) Select, then validate, the associated "postcntrl" file, e.g.,
- xmllint --noout --schema EMC_POST_CTRL_Schema.xsd fv3lam_rrfs.xml
+ xmllint --noout --schema EMC_POST_CTRL_Schema.xsd rrfs_postcntrl.xml
3) If file validation succeeds in steps (1) and (2), generate the .txt flat file, e.g.,
- perl PostXMLPreprocessor.pl fv3lam_rrfs.xml post_avblflds.xml postxconfig-NT-fv3lam_rrfs.txt
+ perl PostXMLPreprocessor.pl rrfs_postcntrl.xml post_avblflds.xml postxconfig-NT-rrfs.txt
- In this example, "fv3lam_rrfs.xml" and "fv3lam_post_avblflds.xml" are input files, read by the perl
- script. The "postxconfig-NT-fv3lam_rrfs.txt" flat file is the output file produced by the script, which
+ In this example, "rrfs_postcntrl.xml" and "post_avblflds.xml" are input files, read by the perl
+ script. The "postxconfig-NT-rrfs.txt" flat file is the output file produced by the script, which
can have any name.
Note that a log file will be created by this script, in addition to the flat file.
diff --git a/parm/makefile b/parm/makefile
index 55a82d860..a685cf5f1 100644
--- a/parm/makefile
+++ b/parm/makefile
@@ -35,7 +35,7 @@ ALL_TXT= \
postxconfig-NT-GFS-F00-TWO.txt \
postxconfig-NT-hrrr.txt \
postxconfig-NT-rap.txt \
- postxconfig-NT-fv3lam_rrfs.txt \
+ postxconfig-NT-rrfs.txt \
postxconfig-NT-UFS-aerosol.txt \
postxconfig-NT-UFS-aerosol-F00.txt \
postxconfig-NT-GEFS-aerosol.txt \
@@ -65,7 +65,7 @@ postxconfig-NT-GFS-TWO.txt: postcntrl_gfs_two.xml post_avblfld
postxconfig-NT-GFS-F00-TWO.txt: postcntrl_gfs_f00_two.xml post_avblflds.xml
postxconfig-NT-hrrr.txt: hrrr_postcntrl.xml post_avblflds_raphrrr.xml
postxconfig-NT-rap.txt: rap_postcntrl.xml post_avblflds_raphrrr.xml
-postxconfig-NT-fv3lam_rrfs.txt: fv3lam_rrfs.xml post_avblflds.xml
+postxconfig-NT-rrfs.txt: rrfs_postcntrl.xml post_avblflds.xml
postxconfig-NT-UFS-aerosol.txt: postcntrl_ufs_aerosol.xml post_avblflds.xml
postxconfig-NT-UFS-aerosol-F00.txt: postcntrl_ufs_aerosol_f00.xml post_avblflds.xml
postxconfig-NT-GEFS-aerosol.txt: postcntrl_gefs_aerosol.xml post_avblflds.xml
diff --git a/parm/post_avblflds.xml b/parm/post_avblflds.xml
index 52580b14d..0225a26ca 100755
--- a/parm/post_avblflds.xml
+++ b/parm/post_avblflds.xml
@@ -6857,7 +6857,10 @@
tmpl4_48
AEMFLX
particulate_org_matter_dry
- surface
+ entire_atmos_single_lyr
+ smaller_than_first_limit
+ 7
+ 25
5.0
@@ -6945,8 +6948,10 @@
755
HWP_ON_SURFACE
+ tmpl4_8
Hourly Wildfire Potential on surface
WFIREPOT
+ AVE
surface
5.0
@@ -8335,5 +8340,45 @@
6.0
+
+ 1015
+ EBB_ON_HYBRID_LVL
+ tmpl4_48
+ AEMFLX
+ particulate_org_matter_dry
+ hybrid_lvl
+ smaller_than_first_limit
+ 7
+ 25
+ 6.0
+
+
+
+ 1016
+ EBB_ON_ISOBARIC_SFC
+ tmpl4_48
+ AEMFLX
+ particulate_org_matter_dry
+ isobaric_sfc
+ smaller_than_first_limit
+ 7
+ 25
+ 6.0
+
+
+
+ 1017
+ EBB_ON_SPEC_HGT_LVL_ABOVE_GRND_8m
+ tmpl4_48
+ AEMFLX
+ particulate_org_matter_dry
+ spec_hgt_lvl_above_grnd
+ 8.
+ smaller_than_first_limit
+ 7
+ 25
+ 6.0
+
+
diff --git a/parm/postxconfig-NT-fv3lam_rrfs.txt b/parm/postxconfig-NT-rrfs.txt
similarity index 97%
rename from parm/postxconfig-NT-fv3lam_rrfs.txt
rename to parm/postxconfig-NT-rrfs.txt
index a0e47132a..3922774b1 100644
--- a/parm/postxconfig-NT-fv3lam_rrfs.txt
+++ b/parm/postxconfig-NT-rrfs.txt
@@ -1,8 +1,8 @@
4
5
3
-235
-284
+229
+276
PRSLEV
32769
ncep_nco
@@ -7419,80 +7419,6 @@ grid_scale_cloud_top_lvl
?
?
?
-200
-TCOLW_ON_ENTIRE_ATMOS
-?
-1
-tmpl4_0
-TCOLW
-NCEP
-?
-entire_atmos_single_lyr
-0
-?
-0
-?
-?
-0
-?
-0
-?
-?
-?
-0
-0.0
-0
-0.0
-?
-0
-0.0
-0
-0.0
-1
-5.0
-0
-0
-0
-?
-?
-?
-201
-TCOLI_ON_ENTIRE_ATMOS
-?
-1
-tmpl4_0
-TCOLI
-?
-?
-entire_atmos_single_lyr
-0
-?
-0
-?
-?
-0
-?
-0
-?
-?
-?
-0
-0.0
-0
-0.0
-?
-0
-0.0
-0
-0.0
-1
-5.0
-0
-0
-0
-?
-?
-?
979
EFSH_ON_EFBL
?
@@ -8011,228 +7937,6 @@ level_free_convection
?
?
?
-202
-TCOLR_ON_ENTIRE_ATMOS
-?
-1
-tmpl4_0
-TCOLR
-?
-?
-entire_atmos_single_lyr
-0
-?
-0
-?
-?
-0
-?
-0
-?
-?
-?
-0
-0.0
-0
-0.0
-?
-0
-0.0
-0
-0.0
-1
-5.0
-0
-0
-0
-?
-?
-?
-203
-TCOLS_ON_ENTIRE_ATMOS
-?
-1
-tmpl4_0
-TCOLS
-?
-?
-entire_atmos_single_lyr
-0
-?
-0
-?
-?
-0
-?
-0
-?
-?
-?
-0
-0.0
-0
-0.0
-?
-0
-0.0
-0
-0.0
-1
-5.0
-0
-0
-0
-?
-?
-?
-204
-TCOLC_ON_ENTIRE_ATMOS
-?
-1
-tmpl4_0
-TCOLC
-NCEP
-?
-entire_atmos_single_lyr
-0
-?
-0
-?
-?
-0
-?
-0
-?
-?
-?
-0
-0.0
-0
-0.0
-?
-0
-0.0
-0
-0.0
-1
-5.0
-0
-0
-0
-?
-?
-?
-428
-TCOLG_ON_ENTIRE_ATMOS
-?
-1
-tmpl4_0
-TCOLG
-?
-?
-entire_atmos_single_lyr
-0
-?
-0
-?
-?
-0
-?
-0
-?
-?
-?
-0
-0.0
-0
-0.0
-?
-0
-0.0
-0
-0.0
-1
-5.0
-0
-0
-0
-?
-?
-?
-285
-TCLSW_ON_ENTIRE_ATMOS
-?
-1
-tmpl4_0
-TCLSW
-NCEP
-?
-entire_atmos_single_lyr
-0
-?
-0
-?
-?
-0
-?
-0
-?
-?
-?
-0
-0.0
-0
-0.0
-?
-0
-0.0
-0
-0.0
-1
-5.0
-0
-0
-0
-?
-?
-?
-286
-TCOLM_ON_ENTIRE_ATMOS
-?
-1
-tmpl4_0
-TCOLM
-NCEP
-?
-entire_atmos_single_lyr
-0
-?
-0
-?
-?
-0
-?
-0
-?
-?
-?
-0
-0.0
-0
-0.0
-?
-0
-0.0
-0
-0.0
-1
-5.0
-0
-0
-0
-?
-?
-?
287
HGT_ON_LWST_BOT_LVL_OF_SUPERCOOLED_LIQ_WATER_LYR
?
@@ -9980,7 +9684,7 @@ tmpl4_48
AEMFLX
?
?
-surface
+entire_atmos_single_lyr
0
?
0
@@ -9991,9 +9695,9 @@ surface
0
?
particulate_org_matter_dry
-?
-0
-0.0
+smaller_than_first_limit
+7
+25
0
0.0
?
@@ -10272,10 +9976,10 @@ entire_atmos_single_lyr
HWP_ON_SURFACE
Hourly Wildfire Potential on surface
1
-tmpl4_0
+tmpl4_8
WFIREPOT
?
-?
+AVE
surface
0
?
@@ -17462,228 +17166,6 @@ grid_scale_cloud_top_lvl
?
?
?
-200
-TCOLW_ON_ENTIRE_ATMOS
-?
-1
-tmpl4_0
-TCOLW
-NCEP
-?
-entire_atmos_single_lyr
-0
-?
-0
-?
-?
-0
-?
-0
-?
-?
-?
-0
-0.0
-0
-0.0
-?
-0
-0.0
-0
-0.0
-1
-5.0
-0
-0
-0
-?
-?
-?
-201
-TCOLI_ON_ENTIRE_ATMOS
-?
-1
-tmpl4_0
-TCOLI
-?
-?
-entire_atmos_single_lyr
-0
-?
-0
-?
-?
-0
-?
-0
-?
-?
-?
-0
-0.0
-0
-0.0
-?
-0
-0.0
-0
-0.0
-1
-5.0
-0
-0
-0
-?
-?
-?
-202
-TCOLR_ON_ENTIRE_ATMOS
-?
-1
-tmpl4_0
-TCOLR
-?
-?
-entire_atmos_single_lyr
-0
-?
-0
-?
-?
-0
-?
-0
-?
-?
-?
-0
-0.0
-0
-0.0
-?
-0
-0.0
-0
-0.0
-1
-5.0
-0
-0
-0
-?
-?
-?
-203
-TCOLS_ON_ENTIRE_ATMOS
-?
-1
-tmpl4_0
-TCOLS
-?
-?
-entire_atmos_single_lyr
-0
-?
-0
-?
-?
-0
-?
-0
-?
-?
-?
-0
-0.0
-0
-0.0
-?
-0
-0.0
-0
-0.0
-1
-5.0
-0
-0
-0
-?
-?
-?
-204
-TCOLC_ON_ENTIRE_ATMOS
-?
-1
-tmpl4_0
-TCOLC
-NCEP
-?
-entire_atmos_single_lyr
-0
-?
-0
-?
-?
-0
-?
-0
-?
-?
-?
-0
-0.0
-0
-0.0
-?
-0
-0.0
-0
-0.0
-1
-5.0
-0
-0
-0
-?
-?
-?
-428
-TCOLG_ON_ENTIRE_ATMOS
-?
-1
-tmpl4_0
-TCOLG
-?
-?
-entire_atmos_single_lyr
-0
-?
-0
-?
-?
-0
-?
-0
-?
-?
-?
-0
-0.0
-0
-0.0
-?
-0
-0.0
-0
-0.0
-1
-5.0
-0
-0
-0
-?
-?
-?
218
VGTYP_ON_SURFACE
?
diff --git a/parm/fv3lam_rrfs.xml b/parm/rrfs_postcntrl.xml
similarity index 97%
rename from parm/fv3lam_rrfs.xml
rename to parm/rrfs_postcntrl.xml
index e4afeec3b..000848dd3 100755
--- a/parm/fv3lam_rrfs.xml
+++ b/parm/rrfs_postcntrl.xml
@@ -1351,19 +1351,6 @@
6.0
-
- TCOLW_ON_ENTIRE_ATMOS
- TCOLW
- NCEP
- 5.0
-
-
-
- TCOLI_ON_ENTIRE_ATMOS
- TCOLI
- 5.0
-
-
EFSH_ON_EFBL
-1.0
@@ -1434,45 +1421,6 @@
-1.0
-
- TCOLR_ON_ENTIRE_ATMOS
- TCOLR
- 5.0
-
-
-
- TCOLS_ON_ENTIRE_ATMOS
- TCOLS
- 5.0
-
-
-
- TCOLC_ON_ENTIRE_ATMOS
- TCOLC
- NCEP
- 5.0
-
-
-
- TCOLG_ON_ENTIRE_ATMOS
- TCOLG
- 5.0
-
-
-
- TCLSW_ON_ENTIRE_ATMOS
- TCLSW
- NCEP
- 5.0
-
-
-
- TCOLM_ON_ENTIRE_ATMOS
- TCOLM
- NCEP
- 5.0
-
-
HGT_ON_LWST_BOT_LVL_OF_SUPERCOOLED_LIQ_WATER_LYR
HGT
@@ -3133,44 +3081,6 @@
6.0
-
- TCOLW_ON_ENTIRE_ATMOS
- TCOLW
- NCEP
- 5.0
-
-
-
- TCOLI_ON_ENTIRE_ATMOS
- TCOLI
- 5.0
-
-
-
- TCOLR_ON_ENTIRE_ATMOS
- TCOLR
- 5.0
-
-
-
- TCOLS_ON_ENTIRE_ATMOS
- TCOLS
- 5.0
-
-
-
- TCOLC_ON_ENTIRE_ATMOS
- TCOLC
- NCEP
- 5.0
-
-
-
- TCOLG_ON_ENTIRE_ATMOS
- TCOLG
- 5.0
-
-
VGTYP_ON_SURFACE
VGTYP
diff --git a/sorc/ncep_post.fd/ALLOCATE_ALL.f b/sorc/ncep_post.fd/ALLOCATE_ALL.f
index 96e0c183f..453bb5fa2 100644
--- a/sorc/ncep_post.fd/ALLOCATE_ALL.f
+++ b/sorc/ncep_post.fd/ALLOCATE_ALL.f
@@ -631,7 +631,6 @@ SUBROUTINE ALLOCATE_ALL()
allocate(snfden(ista_2l:iend_2u,jsta_2l:jend_2u))
allocate(sndepac(ista_2l:iend_2u,jsta_2l:jend_2u))
allocate(mean_frp(ista_2l:iend_2u,jsta_2l:jend_2u))
- allocate(ebb(ista_2l:iend_2u,jsta_2l:jend_2u))
allocate(hwp(ista_2l:iend_2u,jsta_2l:jend_2u))
!Initialization
!$omp parallel do private(i,j)
@@ -658,13 +657,13 @@ SUBROUTINE ALLOCATE_ALL()
snfden(i,j)=spval
sndepac(i,j)=spval
mean_frp(i,j)=spval
- ebb(i,j)=spval
hwp(i,j)=spval
enddo
enddo
allocate(smoke(ista_2l:iend_2u,jsta_2l:jend_2u,lm,nbin_sm))
allocate(fv3dust(ista_2l:iend_2u,jsta_2l:jend_2u,lm,nbin_sm))
allocate(coarsepm(ista_2l:iend_2u,jsta_2l:jend_2u,lm,nbin_sm))
+ allocate(ebb(ista_2l:iend_2u,jsta_2l:jend_2u,lm,nbin_sm))
!$omp parallel do private(i,j,l,k)
do k=1,nbin_sm
do l=1,lm
@@ -673,6 +672,7 @@ SUBROUTINE ALLOCATE_ALL()
smoke(i,j,l,k)=spval
fv3dust(i,j,l,k)=spval
coarsepm(i,j,l,k)=spval
+ ebb(i,j,l,k)=spval
enddo
enddo
enddo
diff --git a/sorc/ncep_post.fd/CALPW.f b/sorc/ncep_post.fd/CALPW.f
index b5fa827f7..90f3ebb0d 100644
--- a/sorc/ncep_post.fd/CALPW.f
+++ b/sorc/ncep_post.fd/CALPW.f
@@ -38,6 +38,7 @@
!> 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
!-----------------------------------------------------------------------
@@ -54,7 +55,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
+ use vrbls4d, only: smoke, fv3dust, coarsepm, ebb
use masks, only: htm
use params_mod, only: tfrz, gi
use ctlblk_mod, only: lm, jsta, jend, im, spval, ista, iend
@@ -297,6 +298,15 @@ 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 4974ffc30..0f299aa49 100644
--- a/sorc/ncep_post.fd/CLDRAD.f
+++ b/sorc/ncep_post.fd/CLDRAD.f
@@ -75,6 +75,7 @@
!> 2023-04-04 | Li(Kate Zhang) | Add namelist optoin for CCPP-Chem (UFS-Chem) model.
!> 2023-04-17 | Eric James | Getting rid of special treatment for RRFS AOD (use RAP/HRRR approach)
!> 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
!>
!> @author Russ Treadon W/NP2 @date 1993-08-30
!---------------------------------------------------------------------------------
@@ -102,7 +103,7 @@ SUBROUTINE CLDRAD
AIRDIFFSWIN, DUSMASS, DUSMASS25, DUCMASS, DUCMASS25, &
ALWINC, ALWTOAC, SWDDNI, SWDDIF, SWDNBC, SWDDNIC, &
SWDDIFC, SWUPBC, LWDNBC, LWUPBC, SWUPT, &
- TAOD5502D, AERSSA2D, AERASY2D, MEAN_FRP, EBB, HWP, &
+ TAOD5502D, AERSSA2D, AERASY2D, MEAN_FRP, HWP, &
LWP, IWP, AVGCPRATE, &
DUSTCB,SSCB,BCCB,OCCB,SULFCB,DUSTPM,SSPM,aod550, &
du_aod550,ss_aod550,su_aod550,oc_aod550,bc_aod550, &
@@ -116,7 +117,7 @@ SUBROUTINE CLDRAD
TCLOD, ARDSW, TRDSW, ARDLW, NBIN_DU, TRDLW, IM, &
NBIN_SS, NBIN_OC,NBIN_BC,NBIN_SU,NBIN_NO3,DTQ2, &
JM, LM, gocart_on, gccpp_on, nasa_on, me, rdaod, &
- ISTA, IEND,aqf_on
+ ISTA, IEND,aqf_on,TSRFC
use rqstfld_mod, only: IGET, ID, LVLS, IAVBLFLD
use gridspec_mod, only: dyval, gridtype
use cmassi_mod, only: TRAD_ice
@@ -156,7 +157,7 @@ SUBROUTINE CLDRAD
REAL, dimension(ista:iend,jsta:jend) :: TCLD, CEILING
real CU_ir(LM), q_conv !bsf
!jw
- integer I,J,L,K,IBOT,ITCLOD,LBOT,LTOP,ITRDSW,ITRDLW, &
+ integer I,J,L,K,IBOT,ITCLOD,LBOT,LTOP,ITRDSW,ITRDLW,ITSRFC, &
LLMH,ITHEAT,IFINCR,ITYPE,ITOP,NUM_THICK
real DPBND,RRNUM,QCLD,RSUM,TLMH,FACTRS,FACTRL,DP, &
OPDEPTH, TMP,QSAT,RHUM,TCEXT,DELZ,DELY,DY_m
@@ -527,6 +528,25 @@ SUBROUTINE CLDRAD
enddo
endif
ENDIF
+!
+! TOTAL COLUMN EBB (BIOMASS BURNING EMISSIONS)
+!
+ IF (IGET(745) > 0) THEN
+ CALL CALPW(GRID1(ista:iend,jsta:iend),24)
+ CALL BOUND(GRID1,D00,H99999)
+ if(grib == "grib2" )then
+ cfld = cfld + 1
+ fld_info(cfld)%ifld = IAVBLFLD(IGET(745))
+!$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
+ datapd(i,j,cfld) = GRID1(ii,jj)
+ enddo
+ enddo
+ endif
+ ENDIF
!
! TOTAL COLUMN CLOUD WATER
IF (IGET(200) > 0 .or. IGET(575) > 0) THEN
@@ -3943,24 +3963,6 @@ SUBROUTINE CLDRAD
endif
ENDIF
-! Biomass burning emissions (EBB)
- IF (IGET(745)>0) THEN
- DO J=JSTA,JEND
- DO I=ISTA,IEND
- IF (EBB(I,J)0) THEN
DO J=JSTA,JEND
@@ -3972,11 +3974,35 @@ SUBROUTINE CLDRAD
ENDIF
ENDDO
ENDDO
- if(grib=='grib2') then
- cfld=cfld+1
- fld_info(cfld)%ifld=IAVBLFLD(IGET(755))
- datapd(1:iend-ista+1,1:jend-jsta+1,cfld)=GRID1(ista:iend,jsta:jend)
+ ID(1:25) = 0
+ ITSRFC = NINT(TSRFC)
+ IF(ITSRFC /= 0) then
+ IFINCR = MOD(IFHR,ITSRFC)
+ IF(IFMIN >= 1)IFINCR= MOD(IFHR*60+IFMIN,ITSRFC*60)
+ ELSE
+ IFINCR = 0
endif
+ ID(19) = IFHR
+ IF(IFMIN >= 1)ID(19)=IFHR*60+IFMIN
+ ID(20) = 3
+ IF (IFINCR==0) THEN
+ ID(18) = IFHR-ITSRFC
+ ELSE
+ ID(18) = IFHR-IFINCR
+ IF(IFMIN >= 1)ID(18)=IFHR*60+IFMIN-IFINCR
+ ENDIF
+ IF (ID(18)<0) ID(18) = 0
+ if(grib=='grib2') then
+ cfld=cfld+1
+ fld_info(cfld)%ifld=IAVBLFLD(IGET(755))
+ if(ITSRFC>0) then
+ fld_info(cfld)%ntrange=1
+ else
+ fld_info(cfld)%ntrange=0
+ endif
+ fld_info(cfld)%tinvstat=IFHR-ID(18)
+ datapd(1:iend-ista+1,1:jend-jsta+1,cfld)=GRID1(ista:iend,jsta:jend)
+ endif
ENDIF
! CURRENT (instantaneous) INCOMING CLEARSKY SW RADIATION AT THE SURFACE.
diff --git a/sorc/ncep_post.fd/INITPOST_NETCDF.f b/sorc/ncep_post.fd/INITPOST_NETCDF.f
index 8537de90e..36c538371 100644
--- a/sorc/ncep_post.fd/INITPOST_NETCDF.f
+++ b/sorc/ncep_post.fd/INITPOST_NETCDF.f
@@ -50,6 +50,7 @@
!> 2024-02-20 | Jaymes Kenyon | Add calculation of PBLHGUST (from INITPOST.F) to support RRFS 10-m wind gust diagnostic
!> 2024-03-15 | Wen Meng | Add option to read 3D soil-related variables
!> 2024-03-25 | Eric James | Enabling reading of snow melt and surface albedo from RRFS
+!> 2024-04-23 | Eric James | Updating smoke emissions to be 3D variable (ebu_smoke)
!>
!> @author Hui-Ya Chuang @date 2016-03-04
!----------------------------------------------------------------------
@@ -63,7 +64,7 @@ SUBROUTINE INITPOST_NETCDF(ncid2d,ncid3d)
use netcdf
- use vrbls4d, only: dust, SALT, SUSO, SOOT, WASO, smoke, fv3dust, coarsepm, &
+ use vrbls4d, only: dust, SALT, SUSO, SOOT, WASO, smoke, fv3dust, coarsepm, ebb, &
no3,nh4, PP25, PP10
use vrbls3d, only: t, q, uh, vh, pmid, pint, alpint, dpres, zint, zmid, o3, &
qqr, qqnr, qqs, qqi, qqni, qqw, qqnw, qqg, qqh, cwm, &
@@ -98,7 +99,7 @@ SUBROUTINE INITPOST_NETCDF(ncid2d,ncid3d)
alwoutc,alwtoac,aswoutc,aswtoac,alwinc,aswinc,avgpotevp,snoavg, &
ti,aod550,du_aod550,ss_aod550,su_aod550,oc_aod550,bc_aod550,prate_max,maod,dustpm10, &
dustcb,bccb,occb,sulfcb,sscb,dustallcb,ssallcb,dustpm,sspm,pp25cb,pp10cb,no3cb,nh4cb,&
- pwat, ebb, hwp, aqm_aod550, ltg1_max,ltg2_max,ltg3_max, hail_maxhailcast, pblhgust
+ pwat, hwp, aqm_aod550, ltg1_max,ltg2_max,ltg3_max, hail_maxhailcast, pblhgust
use soil, only: sldpth, sllevel, sh2o, smc, stc
use masks, only: lmv, lmh, htm, vtm, gdlat, gdlon, dx, dy, hbm2, sm, sice
use physcons_post, only: grav => con_g, fv => con_fvirt, rgas => con_rd, &
@@ -534,14 +535,14 @@ SUBROUTINE INITPOST_NETCDF(ncid2d,ncid3d)
end if
if(me==0)print*,'nhcas= ',nhcas
if (nhcas == 0 ) then !non-hydrostatic case
- nrec=22
+ nrec=23
allocate (recname(nrec))
recname=[character(len=20) :: 'ugrd','vgrd','spfh','tmp','o3mr', &
'presnh','dzdt', 'clwmr','dpres', &
'delz','icmr','rwmr', &
'snmr','grle','hail','smoke', &
'dust','coarsepm','ext550', &
- 'nicp','water_nc','rain_nc']
+ 'ebu_smoke','nicp','water_nc','rain_nc']
else
nrec=8
allocate (recname(nrec))
@@ -908,12 +909,14 @@ SUBROUTINE INITPOST_NETCDF(ncid2d,ncid3d)
spval,recname(18),coarsepm(ista_2l,jsta_2l,1,1),lm)
call read_netcdf_3d_para(ncid2d,im,jm,ista,ista_2l,iend,iend_2u,jsta,jsta_2l,jend,jend_2u, &
spval,recname(19),ext550(ista_2l,jsta_2l,1),lm)
+ call read_netcdf_3d_para(ncid2d,im,jm,ista,ista_2l,iend,iend_2u,jsta,jsta_2l,jend,jend_2u, &
+ spval,recname(20),ebb(ista_2l,jsta_2l,1,1),lm)
call read_netcdf_3d_para(ncid3d,im,jm,ista,ista_2l,iend,iend_2u,jsta,jsta_2l,jend,jend_2u, &
- spval,recname(20),qqni(ista_2l,jsta_2l,1),lm)
+ spval,recname(21),qqni(ista_2l,jsta_2l,1),lm)
call read_netcdf_3d_para(ncid3d,im,jm,ista,ista_2l,iend,iend_2u,jsta,jsta_2l,jend,jend_2u, &
- spval,recname(21),qqnw(ista_2l,jsta_2l,1),lm)
+ spval,recname(22),qqnw(ista_2l,jsta_2l,1),lm)
call read_netcdf_3d_para(ncid3d,im,jm,ista,ista_2l,iend,iend_2u,jsta,jsta_2l,jend,jend_2u, &
- spval,recname(22),qqnr(ista_2l,jsta_2l,1),lm)
+ spval,recname(23),qqnr(ista_2l,jsta_2l,1),lm)
endif
! Compute max QRAIN in the column to be used later in precip type computation
@@ -1069,13 +1072,8 @@ SUBROUTINE INITPOST_NETCDF(ncid2d,ncid3d)
call read_netcdf_2d_para(ncid3d,ista,ista_2l,iend,iend_2u,jsta,jsta_2l,jend,jend_2u, &
spval,VarName,hail_maxhailcast(ista_2l,jsta_2l))
if(debugprint)print*,'sample ',VarName,' =',hail_maxhailcast(isa,jsa)
-! biomass burning emissions
- VarName='ebb_smoke_hr'
- call read_netcdf_2d_para(ncid2d,ista,ista_2l,iend,iend_2u,jsta,jsta_2l,jend,jend_2u, &
- spval,VarName,ebb(ista_2l,jsta_2l))
- if(debugprint)print*,'sample ',VarName,' =',ebb(isa,jsa)
! hourly wildfire potential
- VarName='hwp'
+ VarName='hwp_ave'
call read_netcdf_2d_para(ncid2d,ista,ista_2l,iend,iend_2u,jsta,jsta_2l,jend,jend_2u, &
spval,VarName,hwp(ista_2l,jsta_2l))
if(debugprint)print*,'sample ',VarName,' =',hwp(isa,jsa)
diff --git a/sorc/ncep_post.fd/MDL2P.f b/sorc/ncep_post.fd/MDL2P.f
index f61546b9e..a31102686 100644
--- a/sorc/ncep_post.fd/MDL2P.f
+++ b/sorc/ncep_post.fd/MDL2P.f
@@ -38,6 +38,7 @@
!> 2023-02-23 | E James | Adding coarse PM from RRFS
!> 2023-08-24 | Y Mao | Add gtg_on option for GTG interpolation
!> 2023-09-12 | J Kenyon | Prevent spurious supercooled rain and cloud water
+!> 2024-04-23 | E James | Adding smoke emissions (ebb) from RRFS
!>
!> @author T Black W/NP2 @date 1999-09-23
!--------------------------------------------------------------------------------------
@@ -49,7 +50,7 @@ SUBROUTINE MDL2P(iostatusD3D)
!
!
- use vrbls4d, only: DUST, SMOKE, FV3DUST, COARSEPM
+ use vrbls4d, only: DUST, SMOKE, FV3DUST, COARSEPM, EBB
use vrbls3d, only: PINT, O3, PMID, T, Q, UH, VH, WH, OMGA, Q2, CWM, &
QQW, QQI, QQR, QQS, QQG, DBZ, F_RIMEF, TTND, CFR, &
RLWTT, RSWTT, VDIFFTT, TCUCN, TCUCNS, &
@@ -99,7 +100,7 @@ SUBROUTINE MDL2P(iostatusD3D)
&, OSL_OLD, OSL995 &
&, ICINGFSL, ICINGVSL
REAL, allocatable :: D3DSL(:,:,:), SMOKESL(:,:,:), FV3DUSTSL(:,:,:) &
- &, COARSEPMSL(:,:,:)
+ &, COARSEPMSL(:,:,:), EBBSL(:,:,:)
REAL, allocatable :: GTGSL(:,:),CATSL(:,:),MWTSL(:,:)
!
integer,intent(in) :: iostatusD3D
@@ -180,6 +181,15 @@ SUBROUTINE MDL2P(iostatusD3D)
enddo
enddo
enddo
+ if (.not. allocated(ebbsl)) allocate(ebbsl(im,jm,nbin_sm))
+!$omp parallel do private(i,j,l)
+ do l=1,nbin_sm
+ do j=1,jm
+ do i=1,im
+ EBBSL(i,j,l) = SPVAL
+ enddo
+ enddo
+ enddo
! For GTG, should run MDL2P interpolation?
gtg_interpolation = .false.
@@ -395,6 +405,7 @@ SUBROUTINE MDL2P(iostatusD3D)
IF(SMOKE(I,J,1,K) < SPVAL) SMOKESL(I,J,K)=SMOKE(I,J,1,K)
IF(FV3DUST(I,J,1,K) < SPVAL) FV3DUSTSL(I,J,K)=FV3DUST(I,J,1,K)
IF(COARSEPM(I,J,1,K) < SPVAL) COARSEPMSL(I,J,K)=COARSEPM(I,J,1,K)
+ IF(EBB(I,J,1,K) < SPVAL) EBBSL(I,J,K)=EBB(I,J,1,K)
ENDDO
! only interpolate GFS d3d fields when reqested
@@ -662,6 +673,8 @@ SUBROUTINE MDL2P(iostatusD3D)
FV3DUSTSL(I,J,K)=FV3DUST(I,J,LL,K)+(FV3DUST(I,J,LL,K)-FV3DUST(I,J,LL-1,K))*FACT
IF(COARSEPM(I,J,LL,K) < SPVAL .AND. COARSEPM(I,J,LL-1,K) < SPVAL) &
COARSEPMSL(I,J,K)=COARSEPM(I,J,LL,K)+(COARSEPM(I,J,LL,K)-COARSEPM(I,J,LL-1,K))*FACT
+ IF(EBB(I,J,LL,K) < SPVAL .AND. EBB(I,J,LL-1,K) < SPVAL) &
+ EBBSL(I,J,K)=EBB(I,J,LL,K)+(EBB(I,J,LL,K)-EBB(I,J,LL-1,K))*FACT
ENDDO
! only interpolate GFS d3d fields when == ested
@@ -2391,6 +2404,30 @@ SUBROUTINE MDL2P(iostatusD3D)
cfld = cfld + 1
fld_info(cfld)%ifld=IAVBLFLD(IGET(1013))
fld_info(cfld)%lvl=LVLSXML(LP,IGET(1013))
+!$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
+ datapd(i,j,cfld) = GRID1(ii,jj)
+ enddo
+ enddo
+ endif
+ ENDIF
+ ENDIF
+! E. James - 23 Apr 2024: EBB from RRFS
+ IF (IGET(1016) > 0) THEN
+ IF (LVLS(LP,IGET(1016)) > 0) THEN
+!$omp parallel do private(i,j)
+ DO J=JSTA,JEND
+ DO I=ISTA,IEND
+ GRID1(I,J) = EBBSL(I,J,1)/(1E9)
+ ENDDO
+ ENDDO
+ if(grib == 'grib2')then
+ cfld = cfld + 1
+ fld_info(cfld)%ifld=IAVBLFLD(IGET(1016))
+ fld_info(cfld)%lvl=LVLSXML(LP,IGET(1016))
!$omp parallel do private(i,j,ii,jj)
do j=1,jend-jsta+1
jj = jsta+j-1
@@ -4200,6 +4237,7 @@ SUBROUTINE MDL2P(iostatusD3D)
if(allocated(smokesl)) deallocate(smokesl)
if(allocated(fv3dustsl)) deallocate(fv3dustsl)
if(allocated(coarsepmsl)) deallocate(coarsepmsl)
+if(allocated(ebbsl)) deallocate(ebbsl)
! GTG
if(allocated(GTGSL)) deallocate(GTGSL)
if(allocated(CATSL)) deallocate(CATSL)
diff --git a/sorc/ncep_post.fd/MDLFLD.f b/sorc/ncep_post.fd/MDLFLD.f
index 46139ff09..2e06f77f4 100644
--- a/sorc/ncep_post.fd/MDLFLD.f
+++ b/sorc/ncep_post.fd/MDLFLD.f
@@ -61,6 +61,7 @@
!! 24-01-07 | Y Mao | Add EDPARM IDs to the condition to call gtg_algo()
!! 24-01-24 | H Lin | switching GTG max (gtg) to gtgx3 from gtgx2 per gtg_algo() call
!! 24-02-20 | J Kenyon | Apply the PBLHGUST-related calculations to RRFS
+!! 24-04-23 | E James| Adding smoke emissions (ebb) from RRFS
!!
!! USAGE: CALL MDLFLD
!! INPUT ARGUMENT LIST:
@@ -99,7 +100,7 @@ SUBROUTINE MDLFLD
!
use vrbls4d, only: dust, salt, suso, waso, soot, no3, nh4, smoke, fv3dust,&
- coarsepm
+ coarsepm, ebb
use vrbls3d, only: zmid, t, pmid, q, cwm, f_ice, f_rain, f_rimef, qqw, qqi,&
qqr, qqs, cfr, cfr_raw, dbz, dbzr, dbzi, dbzc, qqw, nlice, nrain, qqg, qqh, zint,&
qqni, qqnr, qqnw, qqnwfa, qqnifa, uh, vh, mcvg, omga, wh, q2, ttnd, rswtt, &
@@ -2446,6 +2447,33 @@ SUBROUTINE MDLFLD
endif
END IF
ENDIF
+!
+! E. James - 23 Apr 2024: EBB from RRFS
+!
+ IF (IGET(1015)>0) THEN
+ IF (LVLS(L,IGET(1015))>0) THEN
+ LL=LM-L+1
+!$omp parallel do private(i,j)
+ DO J=JSTA,JEND
+ DO I=ista,iend
+ GRID1(I,J) = EBB(I,J,LL,1)/(1E9)
+ ENDDO
+ ENDDO
+ if(grib=="grib2") then
+ cfld=cfld+1
+ fld_info(cfld)%ifld=IAVBLFLD(IGET(1015))
+ fld_info(cfld)%lvl=LVLSXML(L,IGET(1015))
+!$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
+ datapd(i,j,cfld) = GRID1(ii,jj)
+ enddo
+ enddo
+ endif
+ END IF
+ ENDIF
!
if ( gocart_on .or. gccpp_on .or. nasa_on ) then
! DUST 1
diff --git a/sorc/ncep_post.fd/SURFCE.f b/sorc/ncep_post.fd/SURFCE.f
index 85a099a3c..3ed30fa53 100644
--- a/sorc/ncep_post.fd/SURFCE.f
+++ b/sorc/ncep_post.fd/SURFCE.f
@@ -49,6 +49,7 @@
!> 2024-01-30 | A Jensen | Comment out graupel precipitation warning.
!> 2024-02-07 | E James | Enabling output of LAI and wilting point for RRFS.
!> 2024-03-25 | E James | Enabling output of column integrated soil moisture.
+!> 2024-04-23 | E James | Adding smoke emissions (ebb) from RRFS
!>
!> @note
!> USAGE: CALL SURFCE
@@ -75,7 +76,7 @@ SUBROUTINE SURFCE
!
! INCLUDE GRID DIMENSIONS. SET/DERIVE OTHER PARAMETERS.
!
- use vrbls4d, only: smoke, fv3dust, coarsepm
+ use vrbls4d, only: smoke, fv3dust, coarsepm, ebb
use vrbls3d, only: zint, pint, t, pmid, q, f_rimef
use vrbls2d, only: ths, qs, qvg, qv2m, tsnow, tg, smstav, smstot, &
cmc, sno, snoavg, psfcavg, t10avg, snonc, ivgtyp, &
@@ -2225,6 +2226,22 @@ SUBROUTINE SURFCE
endif
ENDIF
!
+! E. James - 23 Apr 2024: EBB from RRFS on lowest model level
+!
+ IF (IGET(1017)>0) THEN
+ GRID1=SPVAL
+ DO J=JSTA,JEND
+ DO I=ISTA,IEND
+ GRID1(I,J) = EBB(I,J,LM,1)/(1E9)
+ ENDDO
+ ENDDO
+ if(grib=='grib2') then
+ cfld=cfld+1
+ fld_info(cfld)%ifld=IAVBLFLD(IGET(1017))
+ datapd(1:iend-ista+1,1:jend-jsta+1,cfld) = GRID1(ista:iend,jsta:jend)
+ endif
+ ENDIF
+!
!
! BLOCK 3. ANEMOMETER LEVEL (10M) WINDS, THETA, AND Q.
!
diff --git a/sorc/ncep_post.fd/VRBLS2D_mod.f b/sorc/ncep_post.fd/VRBLS2D_mod.f
index c7f10ce25..bed4ffeda 100644
--- a/sorc/ncep_post.fd/VRBLS2D_mod.f
+++ b/sorc/ncep_post.fd/VRBLS2D_mod.f
@@ -61,7 +61,7 @@ module vrbls2d
,SWRADmean(:,:),U10mean(:,:),V10mean(:,:),SPDUV10mean(:,:) &
,SWNORMmean(:,:),SNFDEN(:,:),SNDEPAC(:,:),SWDDNI(:,:),SWDDIF(:,:) &
,SWDNBC(:,:),SWDDNIC(:,:),SWDDIFC(:,:), SWUPBC(:,:), SWUPT(:,:) &
- ,TAOD5502D(:,:),AERASY2D(:,:),AERSSA2D(:,:),MEAN_FRP(:,:),EBB(:,:) &
+ ,TAOD5502D(:,:),AERASY2D(:,:),AERSSA2D(:,:),MEAN_FRP(:,:) &
,HWP(:,:),LWP(:,:),IWP(:,:),XLAIXY(:,:) &
! add new fields for GFS
,SFCUX(:,:),SFCVX(:,:),SFCUXI(:,:), SFCVXI(:,:),AVGALBEDO(:,:),AVGCPRATE(:,:) &
diff --git a/sorc/ncep_post.fd/VRBLS4D_mod.f b/sorc/ncep_post.fd/VRBLS4D_mod.f
index a31dd77ab..17bc0f6ff 100644
--- a/sorc/ncep_post.fd/VRBLS4D_mod.f
+++ b/sorc/ncep_post.fd/VRBLS4D_mod.f
@@ -16,6 +16,7 @@ module vrbls4d
real, allocatable :: SMOKE(:,:,:,:)
real, allocatable :: FV3DUST(:,:,:,:)
real, allocatable :: COARSEPM(:,:,:,:)
+ real, allocatable :: EBB(:,:,:,:)
real, allocatable :: PP25(:,:,:,:) ! PP25
real, allocatable :: PP10(:,:,:,:) ! PP10
!