diff --git a/jobs/JREGIONAL_PROCESS_SMOKE b/jobs/JREGIONAL_PROCESS_SMOKE
new file mode 100755
index 000000000..f1b0555f5
--- /dev/null
+++ b/jobs/JREGIONAL_PROCESS_SMOKE
@@ -0,0 +1,170 @@
+#!/bin/bash
+#
+#-----------------------------------------------------------------------
+#
+# This J-JOB script runs the radar reflectivity preprocess
+# for the FV3-LAM model
+#
+#-----------------------------------------------------------------------
+#
+#-----------------------------------------------------------------------
+#
+# Source the variable definitions file and the bash utility functions.
+#
+#-----------------------------------------------------------------------
+#
+. ${GLOBAL_VAR_DEFNS_FP}
+. $USHDIR/source_util_funcs.sh
+
+#
+#-----------------------------------------------------------------------
+#
+# Save current shell options (in a global array). Then set new options
+# for this script/function.
+#
+#-----------------------------------------------------------------------
+#
+{ save_shell_opts; set -u +x; } > /dev/null 2>&1
+#
+#-----------------------------------------------------------------------
+#
+# Get the full path to the file in which this script/function is located
+# (scrfunc_fp), the name of that file (scrfunc_fn), and the directory in
+# which the file is located (scrfunc_dir).
+#
+#-----------------------------------------------------------------------
+#
+
+scrfunc_fp=$( readlink -f "${BASH_SOURCE[0]}" )
+scrfunc_fn=$( basename "${scrfunc_fp}" )
+scrfunc_dir=$( dirname "${scrfunc_fp}" )
+#
+#-----------------------------------------------------------------------
+#
+# Print message indicating entry into script.
+#
+#-----------------------------------------------------------------------
+#
+print_info_msg "
+========================================================================
+Entering script: \"${scrfunc_fn}\"
+In directory: \"${scrfunc_dir}\"
+
+This is the J-job script for the task that runs a radar reflectivity
+preprocess with FV3 for the specified cycle.
+========================================================================"
+#
+#-----------------------------------------------------------------------
+#
+# Create the working directory under the cycle directory.
+#
+#-----------------------------------------------------------------------
+#
+if [ ${CYCLE_TYPE} == "spinup" ]; then
+ workdir=${CYCLE_DIR}/process_smoke_spinup
+else
+ workdir=${CYCLE_DIR}/process_smoke
+fi
+rm -fr ${workdir}
+mkdir_vrfy -p ${workdir}
+#
+#
+#
+gridspec_dir=${NWGES_BASEDIR}/grid_spec
+#
+#-----------------------------------------------------------------------
+#
+# Set the name of and create the directory in which the output from this
+# script will be saved for long time (if that directory doesn't already exist).
+# Usually ics_dir under tmpnwprd should be purged fairly soon after cycle done
+#
+#-----------------------------------------------------------------------
+#
+rave_nwges_dir=${NWGES_DIR}/RAVE_INTP
+mkdir_vrfy -p "${rave_nwges_dir}"
+#-----------------------------------------------------------------------
+#
+# Call the ex-script for this J-job and pass to it the necessary varia-
+# bles.
+#
+#-----------------------------------------------------------------------
+#
+cd_vrfy ${workdir}
+python -u ${SCRIPTSDIR}/preprocess_smoke.py \
+ "${FIRE_RRFS_ROOT}/${PREDEF_GRID_NAME}/fixed" \
+ "${FIRE_RAVE_DIR}" \
+ "${rave_nwges_dir}" \
+ "${PREDEF_GRID_NAME}" \
+print_err_msg_exit "\
+Call to pyscript \"${scrfunc_fn}\" failed."
+
+ECHO=/bin/echo
+AWK="/bin/gawk --posix"
+SED=/bin/sed
+DATE=/bin/date
+
+START_DATE=$(echo "${CDATE}" | sed 's/\([[:digit:]]\{2\}\)$/ \1/')
+YYYYMMDDHH=$(date +%Y%m%d%H -d "${START_DATE}")
+YYYYMMDD=${YYYYMMDDHH:0:8}
+HH=${YYYYMMDDHH:8:2}
+echo ${YYYYMMDD}
+echo ${HH}
+
+current_day=`${DATE} -d "${YYYYMMDD}"`
+HH=${HH}
+current_hh=`${DATE} -d ${HH} +"%H"`
+prev_hh=`${DATE} -d "$current_hh -24 hour" +"%H"`
+previous_day=`${DATE} '+%C%y%m%d' -d "$current_day-1 days"`
+previous_day=${previous_day}${prev_hh}
+output_filename=SMOKE_RRFS_data_${YYYYMMDDHH}00.nc
+#output_filename=SMOKE_RRFS_data_${previous_day}00.nc
+echo ${previous_day}
+echo ${output_filename}
+
+#cd_vrfy /mnt/lfs4/BMC/gsd-fv3-dev/FIRE_RRFS_ROOT/RAVE_INTP2
+cd_vrfy ${rave_nwges_dir}
+echo ${rave_nwges_dir}
+
+# Convert START_TIME from 'YYYYMMDDHH' format to Unix date format, e.g. "Fri May 6 19:50:23 GMT 2005"
+if [ `${ECHO} "${previous_day}" | ${AWK} '/^[[:digit:]]{10}$/'` ]; then
+ previous_day=`${ECHO} "${previous_day}" | ${SED} 's/\([[:digit:]]\{2\}\)$/ \1/'`
+else
+ ${ECHO} "ERROR: start time, '${previous_day}', is not in 'yyyymmddhh' or 'yyyymmdd hh' format"
+ exit 1
+fi
+previous_day=`${DATE} -d "${previous_day}"`
+echo ${previous_day}
+
+nfiles=24
+files2cat=()
+for i in $(seq 0 $(($nfiles - 1)) )
+do
+timestr=`date +%Y%m%d%H -d "$previous_day + $i hours"`
+echo ${timestr}
+files2cat[$i]=${PREDEF_GRID_NAME}_intp_${timestr}00_${timestr}00.nc
+done
+echo ${files2cat[*]}
+ncrcat ${files2cat[*]} ${output_filename}
+
+#
+#-----------------------------------------------------------------------
+#
+# Print exit message.
+#
+#-----------------------------------------------------------------------
+#
+print_info_msg "
+========================================================================
+Exiting script: \"${scrfunc_fn}\"
+In directory: \"${scrfunc_dir}\"
+========================================================================"
+#
+#-----------------------------------------------------------------------
+#
+# Restore the shell options saved at the beginning of this script/func-
+# tion.
+#
+#-----------------------------------------------------------------------
+#
+{ restore_shell_opts; } > /dev/null 2>&1
+
diff --git a/jobs/JREGIONAL_RUN_FCST b/jobs/JREGIONAL_RUN_FCST
index b21e029bd..068b8d769 100755
--- a/jobs/JREGIONAL_RUN_FCST
+++ b/jobs/JREGIONAL_RUN_FCST
@@ -96,7 +96,8 @@ $SCRIPTSDIR/exregional_run_fcst.sh \
cycle_dir="${run_dir}" \
gridspec_dir="${gridspec_dir}" \
ensmem_indx="${ENSMEM_INDX}" \
- slash_ensmem_subdir="${SLASH_ENSMEM_SUBDIR}" || \
+ slash_ensmem_subdir="${SLASH_ENSMEM_SUBDIR}" \
+ NWGES_BASEDIR="${NWGES_BASEDIR}" || \
print_err_msg_exit "\
Call to ex-script corresponding to J-job \"${scrfunc_fn}\" failed."
#
diff --git a/modulefiles/tasks/hera/run_proc_smoke.local b/modulefiles/tasks/hera/run_proc_smoke.local
new file mode 100644
index 000000000..a5922e45d
--- /dev/null
+++ b/modulefiles/tasks/hera/run_proc_smoke.local
@@ -0,0 +1,4 @@
+#%Module
+module use /contrib/miniconda3/modulefiles
+module load miniconda3/4.5.12
+setenv SRW_ENV /scratch1/BMC/acomp/Johana/miniconda/envs/interpol_esmpy
diff --git a/modulefiles/tasks/jet/run_proc_smoke.local b/modulefiles/tasks/jet/run_proc_smoke.local
new file mode 100644
index 000000000..1900fc5aa
--- /dev/null
+++ b/modulefiles/tasks/jet/run_proc_smoke.local
@@ -0,0 +1,4 @@
+#%Module
+module use /contrib/miniconda3/modulefiles
+module load miniconda3/4.5.12
+setenv SRW_ENV /home/Johana.Romero-Alvarez/miniconda3/envs/interpol_esmpy
diff --git a/scripts/exregional_run_fcst.sh b/scripts/exregional_run_fcst.sh
index 11f7162ed..27a294079 100755
--- a/scripts/exregional_run_fcst.sh
+++ b/scripts/exregional_run_fcst.sh
@@ -71,6 +71,7 @@ valid_args=( \
"gridspec_dir" \
"ensmem_indx" \
"slash_ensmem_subdir" \
+"NWGES_BASEDIR" \
)
process_args valid_args "$@"
#
@@ -410,8 +411,14 @@ fi
if [ "${DO_SMOKE_DUST}" = "TRUE" ]; then
ln_vrfy -snf ${FIX_SMOKE_DUST}/${PREDEF_GRID_NAME}/dust12m_data.nc ${run_dir}/INPUT/dust12m_data.nc
ln_vrfy -snf ${FIX_SMOKE_DUST}/${PREDEF_GRID_NAME}/emi_data.nc ${run_dir}/INPUT/emi_data.nc
- #yyyymmdd=${cdate:0:8}
- ln_vrfy -snf ${FIRE_RRFS_ROOT}/${PREDEF_GRID_NAME}/FIRE_RRFS_data_3km_in.nc ${run_dir}/INPUT/SMOKE_RRFS_data.nc
+ yyyymmddhh=${cdate:0:10}
+ echo ${yyyymmddhh}
+ echo ${NWGES_BASEDIR}/RAVE_INTP/SMOKE_RRFS_data_${yyyymmddhh}00.nc
+ if [ -f ${NWGES_BASEDIR}/RAVE_INTP/SMOKE_RRFS_data_${yyyymmddhh}00.nc ]; then
+ ln_vrfy -snf ${NWGES_BASEDIR}/RAVE_INTP/SMOKE_RRFS_data_${yyyymmddhh}00.nc ${run_dir}/INPUT/SMOKE_RRFS_data.nc
+ else
+ ln_vrfy -snf ${FIRE_RRFS_ROOT}/${PREDEF_GRID_NAME}/fixed/dummy_24hr_smoke.nc ${run_dir}/INPUT/SMOKE_RRFS_data.nc
+ fi
fi
#
#-----------------------------------------------------------------------
diff --git a/scripts/preprocess_smoke.py b/scripts/preprocess_smoke.py
new file mode 100755
index 000000000..b4d351336
--- /dev/null
+++ b/scripts/preprocess_smoke.py
@@ -0,0 +1,315 @@
+###################################################
+# #
+# RRFS-SD smoke preprocessing #
+# #
+###################################################
+
+import sys
+import xarray as xr
+import datetime as dt
+from datetime import date, time,timedelta
+import pandas as pd
+import numpy as np
+import ESMF
+from netCDF4 import Dataset
+import os
+import shutil
+
+# fix files
+staticdir = sys.argv[1]
+ravedir = sys.argv[2]
+newges_dir = sys.argv[3]
+predef_grid = sys.argv[4]
+#Constants
+beta= 0.38
+#units conversion
+to_s=3.6e3
+fkg_to_ug=1e9
+fg_to_ug=1e6
+
+#Emission factors
+EF_FLM = dict({'frst':19,'hwd':9.4,'mxd':14.6,'shrb':9.3,'shrb_grs':10.7,'grs':13.3})
+EF_SML = dict({'frst':28,'hwd':37.7,'mxd':17.6,'shrb':36.6,'shrb_grs':36.7,'grs':38.4})
+
+#Bring/create env vars from workflow
+current_day = os.environ.get("CDATE")
+nwges_dir = os.environ.get("NWGES_DIR")
+
+#Fixed files directories
+normal_template_file = staticdir+'/pypost_conus_basic_template.grib2'
+veg_map = staticdir+'/veg_map.nc'
+grid_in= staticdir+'/grid_in_new_dom.nc'
+weightfile= staticdir+'/CONUS_G2_3km_weight_file.nc'
+grid_out = staticdir+'/ds_out_base.nc'
+dummy_hr_rave=staticdir+'/dummy_hr_rave.nc'
+
+#Create date range
+print('Searching for interpolated RAVE for',current_day)
+fcst_YYYYMMDDHH=dt.datetime.strptime(current_day, "%Y%m%d%H")
+previous_day=fcst_YYYYMMDDHH - timedelta(days = 1)
+date_list=pd.date_range(previous_day,periods=24,freq="H")
+fcst_dates=date_list.strftime("%Y%m%d%H")
+rave_to_intp= predef_grid+"_intp_"
+#rave_to_intp="CONUS_3km_intp_"
+print('fcst_YYYYMMDDHH', fcst_YYYYMMDDHH, previous_day, fcst_dates[5])
+
+#Check if interoplated RAVE is available for the previous 24 hours. Create dummy RAVE if given hours are not available
+#RAVE='/mnt/lfs4/BMC/gsd-fv3-dev/Johana.R/FIRE_RRFS_ROOT/RAVE_INTP/test_new_wf'
+#RAVE='/lfs4/BMC/public/data/grids/nesdis/3km_fire_emissions'
+RAVE=ravedir
+intp_dir=newges_dir
+#intp_dir= os.path.join(newges_dir,"RAVE_INTP")
+#intp_dir= os.path.join(FIRE_RRFS_ROOT,"RAVE_INTP")
+
+os.chdir(intp_dir)
+sorted_obj = sorted(os.listdir(intp_dir))
+intp_avail_hours=[]
+intp_non_avail_hours=[]
+for d in range(len(fcst_dates)):
+ #print(d)
+ if rave_to_intp+fcst_dates[d]+'00_'+fcst_dates[d]+'00.nc' in sorted_obj:
+ print('RAVE interpolated available for',rave_to_intp+fcst_dates[d]+'00_'+fcst_dates[d]+'00.nc')
+ intp_avail_hours.append(fcst_dates[d])
+ else:
+ print('Create interpolated RAVE for',rave_to_intp+fcst_dates[d]+'00_'+fcst_dates[d]+'00.nc')
+ intp_non_avail_hours.append(fcst_dates[d])
+print('Avail_intp_hours',intp_avail_hours,'Non_avail_intp_hours',intp_non_avail_hours)
+
+#Check if raw RAVE in intp_non_avail_hours is available to interpolate
+os.chdir(RAVE)
+raw_rave="Hourly_Emissions_3km_"
+sorted_obj = sorted(os.listdir(RAVE))
+
+rave_avail=[]
+rave_avail_hours=[]
+rave_nonavail_hours_test=[]
+for d in range(len(intp_non_avail_hours)):
+# print(d)
+ if raw_rave+intp_non_avail_hours[d]+'00_'+intp_non_avail_hours[d]+'00.nc' in sorted_obj:
+ print('Raw RAVE available for interpolation',raw_rave+intp_non_avail_hours[d]+'00_'+intp_non_avail_hours[d]+'00.nc')
+ rave_avail.append(raw_rave+intp_non_avail_hours[d]+'00_'+intp_non_avail_hours[d]+'00.nc')
+ rave_avail_hours.append(intp_non_avail_hours[d])
+ else:
+ print('Raw RAVE non_available for interpolation',raw_rave+intp_non_avail_hours[d]+'00_'+intp_non_avail_hours[d]+'00.nc')
+ rave_nonavail_hours_test.append(intp_non_avail_hours[d])
+print("Raw RAVE available",rave_avail_hours, "rave_nonavail_hours_test",rave_nonavail_hours_test)
+
+#rave_non_avail_hours= [x for x in fcst_dates if x not in rave_avail_hours]
+#print("Raw RAVE non available",rave_non_avail_hours)
+
+#Interpolate raw rave_avail_hours
+os.chdir(intp_dir)
+print('INTERPOLATION SCRIPT', os.getcwd())
+
+#source RAW emission grid file
+ds_in=xr.open_dataset(grid_in)
+
+#target (3-km) grid file
+ds_out = xr.open_dataset(grid_out)
+tgt_area=ds_out['area']
+
+#source center lat/lon
+src_latt = ds_in['grid_latt']
+src_lont = ds_in['grid_lont']
+#source corner lat/lon
+src_lat = ds_in['grid_lat']
+src_lon = ds_in['grid_lon']
+
+#target center lat/lon
+tgt_latt = ds_out['grid_latt']
+tgt_lont = ds_out['grid_lont']
+#target center lat/lon
+tgt_lat = ds_out['grid_lat']
+tgt_lon = ds_out['grid_lon']
+
+#grid shapes
+src_shape = src_latt.shape
+tgt_shape = tgt_latt.shape
+print('SHAPE',src_shape)
+
+#build the ESMF grid coordinates
+srcgrid = ESMF.Grid(np.array(src_shape), staggerloc=[ESMF.StaggerLoc.CENTER, ESMF.StaggerLoc.CORNER],coord_sys=ESMF.CoordSys.SPH_DEG)
+tgtgrid = ESMF.Grid(np.array(tgt_shape), staggerloc=[ESMF.StaggerLoc.CENTER, ESMF.StaggerLoc.CORNER],coord_sys=ESMF.CoordSys.SPH_DEG)
+
+#pointers to source and target center grid coordinates
+src_cen_lon = srcgrid.get_coords(0, staggerloc=ESMF.StaggerLoc.CENTER)
+src_cen_lat = srcgrid.get_coords(1, staggerloc=ESMF.StaggerLoc.CENTER)
+
+tgt_cen_lon = tgtgrid.get_coords(0, staggerloc=ESMF.StaggerLoc.CENTER)
+tgt_cen_lat = tgtgrid.get_coords(1, staggerloc=ESMF.StaggerLoc.CENTER)
+
+#pass the actual center grid coordinates to pointers
+src_cen_lon[...] = src_lont
+src_cen_lat[...] = src_latt
+
+tgt_cen_lon[...] = tgt_lont
+tgt_cen_lat[...] = tgt_latt
+
+#read in the pre-generated weight file to speed up regridding
+filename =weightfile
+
+#dummy source and target fields
+srcfield = ESMF.Field(srcgrid, name='test')
+tgtfield = ESMF.Field(tgtgrid, name='test')
+
+#generate regridder
+print('GENERATING REGRIDDER')
+regridder = ESMF.RegridFromFile(srcfield, tgtfield,filename)
+
+#Functions to define output variable meta data
+def Store_time_by_Level(fout,varname,var,long_name,yr,mm,dd,cyc):
+ if varname=='time':
+ var_out = fout.createVariable(varname, 'f4', ('t'))
+ var_out.long_name = long_name
+ var_out.standard_name = long_name
+ fout.variables[varname][:]=var
+ var_out.calendar = 'gregorian'
+ var_out.axis='t'
+ var_out.time_increment='010000'
+def Store_latlon_by_Level(fout,varname,var,long_name,units,dim,fval,sfactor):
+ if dim=='2D':
+ var_out = fout.createVariable(varname, 'f4', ('lat','lon'))
+ var_out.units=units
+ var_out.long_name=long_name
+ var_out.standard_name=varname
+ fout.variables[varname][:]=var
+ var_out.FillValue=fval
+ var_out.coordinates='geolat geolon'
+def Store_by_Level(fout,varname,long_name,units,dim,fval,sfactor):
+ if dim=='3D':
+ var_out = fout.createVariable(varname, 'f4', ('t','lat','lon'))
+ var_out.units=units
+ var_out.long_name = long_name
+ var_out.standard_name=long_name
+ var_out.FillValue=fval
+ var_out.coordinates='t geolat geolon'
+
+#Open LU map and extract land categories
+LU_map=(veg_map)
+nc_land= xr.open_dataset(LU_map)
+vtype= nc_land['vtype'][0,:,:]
+vtype_val=vtype.values
+
+#Processing EF
+cols=1092
+rows=1820
+arr_parent_EFs=np.zeros((cols, rows))
+for i in range(cols):
+ for j in range(rows):
+ efs=vtype_val[i][j]
+# print((efs))
+ if efs == 1 or efs == 2:
+ EF_12= (0.75*EF_FLM['frst'])+(0.25*EF_SML['frst'])
+ #print(EF_12)
+ arr_parent_EFs[i][j] = EF_12
+ elif efs == 3 or efs == 4:
+ EF_34= (0.80*EF_FLM['hwd'])+(0.20*EF_SML['hwd'])
+ arr_parent_EFs[i][j] = EF_34
+ elif efs == 5:
+ EF_5= (0.85*EF_FLM['mxd'])+(0.15*EF_SML['mxd'])
+ arr_parent_EFs[i][j] = EF_5
+ elif efs == 6 or efs == 7:
+ EF_6= (0.95*EF_FLM['shrb'])+(0.05*EF_SML['shrb'])
+ arr_parent_EFs[i][j] = EF_6
+ elif efs == 8:
+ EF_7= (0.95*EF_FLM['shrb_grs'])+(0.05*EF_SML['shrb_grs'])
+ arr_parent_EFs[i][j] = EF_7
+ elif efs == 9 or efs == 10:
+ EF_8= (0.95*EF_FLM['grs'])+(0.05*EF_SML['grs'])
+ arr_parent_EFs[i][j] = EF_8
+ elif efs == 12 or efs == 13 or efs == 14 :
+ EF_9= (0.95*EF_FLM['grs'])+(0.05*EF_SML['grs'])
+ arr_parent_EFs[i][j] = EF_9
+ else:
+ #print('NADA')
+ EF_rest= 0
+ arr_parent_EFs[i][j] = EF_rest
+
+#variable list
+vars_emis = ["PM2.5","FRP_MEAN","FRP_SD","FRE"]
+
+#open raw RAVE available for interpolation
+for f in range(len(rave_avail)):
+# print(f)
+ os.chdir(RAVE)
+ if rave_avail[f] in sorted_obj:
+ print(rave_avail[f])
+ rave_name=rave_avail[f]
+ ds_togrid=xr.open_dataset(rave_avail[f])
+ print('DS to GRID',ds_togrid)
+ area=ds_togrid['area'] #source area (km^-2)
+ QA=ds_togrid['QA'] #QC flags for fire emis
+ FRE_threshold= ds_togrid['FRE']
+ os.chdir(intp_dir)
+ fout=Dataset(rave_to_intp+rave_name[21:33]+'_'+rave_name[21:33]+'.nc','w')
+ fout.createDimension('t',None)
+ fout.createDimension('lat',1092)
+ fout.createDimension('lon',1820)
+ setattr(fout,'PRODUCT_ALGORITHM_VERSION','Beta')
+ setattr(fout,'TIME_RANGE','1 hour')
+ setattr(fout,'RangeBeginningDate)',rave_name[21:25]+'-'+rave_name[25:27]+'-'+rave_name[27:29])
+ setattr(fout,'RangeBeginningTime\(UTC-hour\)',rave_name[29:31])
+ setattr(fout,'WestBoundingCoordinate\(degree\)','227.506f')
+ setattr(fout,'EastBoundingCoordinate\(degree\)','297.434f')
+ setattr(fout,'NorthBoundingCoordinate\(degree\)','52.058f')
+ setattr(fout,'SouthBoundingCoordinate\(degree\)','22.136f')
+ Store_latlon_by_Level(fout,'geolat',tgt_latt,'cell center latitude','degrees_north','2D','-9999.f','1.f')
+ Store_latlon_by_Level(fout,'geolon',tgt_lont,'cell center longitude','degrees_east','2D','-9999.f','1.f')
+ for svar in vars_emis:
+ print(svar)
+ srcfield = ESMF.Field(srcgrid, name=svar)
+ tgtfield = ESMF.Field(tgtgrid, name=svar)
+ if svar=='FRP_MEAN':
+ Store_by_Level(fout,'frp_avg_hr','Mean Fire Radiative Power','MW','3D','0.f','1.f')
+ elif svar=='FRE':
+ Store_by_Level(fout,'ebb_smoke_hr','Fire Radiative Energy','ug m-2 s-1','3D','0.f','1.f')
+ elif svar=='FRP_SD':
+ Store_by_Level(fout,'frp_std_hr','Standar Deviation of Fire Radiative Energy','MW','3D','0.f','1.f')
+ elif svar=='PM2.5':
+ Store_by_Level(fout,'ebu_oc','PM2.5 emissions','ug m-2 h-1','3D','0.f','1.f')
+ else :
+ Store_by_Level(fout,svar,svar+' Biomass Emissions','kg m-2 h-1','3D','0.f','1.f')
+# #converted source data from kg to kg/km^2 (need fluxes instead of mass for regridding)
+ src_rate = ds_togrid[svar].fillna(0)/area
+ #apply QC flags
+ src_QA=xr.where(((QA>1)&(FRE_threshold>1000)),src_rate,0.0)
+ #print(src_QA)
+ srcfield.data[...] = src_QA[0,:,:]
+ #print(srcfield.data)
+ #generate the regridded fields (target)
+ tgtfield = regridder(srcfield, tgtfield)
+ if svar=='FRP_MEAN':
+ tgt_rate = tgtfield.data*(tgt_area*1.e-6)
+ fout.variables['frp_avg_hr'][0,:,:] = tgt_rate
+ elif svar=='FRE':
+ tgt_rate = tgtfield.data*(tgt_area*1.e-6)
+ tgt_rate = tgt_rate*arr_parent_EFs*beta
+ tgt_rate = (tgt_rate*fg_to_ug)/to_s
+ tgt_rate = tgt_rate/tgt_area
+ tgt_rate =xr.DataArray(tgt_rate)
+ fout.variables['ebb_smoke_hr'][0,:,:] = tgt_rate
+ elif svar=='FRP_SD':
+ tgt_rate = tgtfield.data*(tgt_area*1.e-6)
+ fout.variables['frp_std_hr'][0,:,:] = tgt_rate
+ elif svar=='PM2.5':
+ tgt_rate = tgtfield.data*1.e-6#/3600 #unit conversion from kg/km^2 to kg/m^2/s
+ tgt_rate = (tgt_rate*fkg_to_ug)/(to_s*tgt_area)
+ #print(tgt_rate)
+ fout.variables['ebu_oc'][0,:,:] = tgt_rate
+ else :
+ tgt_rate = tgtfield.data*1.e-6#/3600 #unit conversion from kg/km^2 to kg/m^2/s
+ #print(tgt_rate)
+ fout.variables[svar][0,:,:] = tgt_rate
+ ds_togrid.close()
+ fout.close()
+
+#create a dummy hr rave interpolated file for rave_non_avail_hours
+os.chdir(intp_dir)
+for i in rave_nonavail_hours_test:
+ print('Producing raw RAVE dummy files for:',i)
+ dummy_rave=xr.open_dataset(dummy_hr_rave)
+ missing_rave=xr.zeros_like(dummy_rave)
+ missing_rave.attrs['RangeBeginningDate']=i[0:4]+'-'+i[4:6]+'-'+i[6:8]
+ missing_rave.attrs['RangeBeginningTime\(UTC-hour\)']= i[8:10]
+ missing_rave.to_netcdf(rave_to_intp+i+'00_'+i+'00.nc',unlimited_dims={'t':True})
+
diff --git a/ush/config_defaults.sh b/ush/config_defaults.sh
index d305413d8..5950ca68a 100644
--- a/ush/config_defaults.sh
+++ b/ush/config_defaults.sh
@@ -304,6 +304,7 @@ EXPT_SUBDIR=""
# SOIL_SURGERY_time: cycle time for soil surgery
#
# Setup default locations for FIRE_RRFS files and update time
+# FIRE_RAVE_DIR
# FIRE_RRFS_ROOT
# FIRE_RRFS_update_hour
#-----------------------------------------------------------------------
@@ -342,7 +343,8 @@ IMSSNOW_ROOT="/public/data/grids/ncep/snow/ims96/grib2"
SNOWICE_update_hour=99
RAPHRR_SOIL_ROOT="/mnt/lfs4/BMC/rtwbl/mhu/wcoss/nco/com"
SOIL_SURGERY_time=9999999999
-FIRE_RRFS_ROOT="/path/to/FIRE_RRFS/files"
+FIRE_RAVE_DIR="/lfs4/BMC/public/data/grids/nesdis/3km_fire_emissions"
+FIRE_RRFS_ROOT="/mnt/lfs4/BMC/gsd-fv3-dev/FIRE_RRFS_ROOT"
FIRE_RRFS_update_hour=99
#
@@ -1651,6 +1653,7 @@ PROCESS_RADAR_REF_TN="process_radarref"
PROCESS_LIGHTNING_TN="process_lightning"
RADAR_REF_THINNING="1"
PROCESS_BUFR_TN="process_bufr"
+PROCESS_SMOKE_TN="process_smoke"
RADAR_REFL2TTEN_TN="radar_refl2tten"
CLDANL_NONVAR_TN="cldanl_nonvar"
SAVE_RESTART_TN="save_restart"
@@ -1676,6 +1679,7 @@ NNODES_RUN_RECENTER="2"
NNODES_PROC_RADAR="2"
NNODES_PROC_LIGHTNING="1"
NNODES_PROC_BUFR="1"
+NNODES_PROC_SMOKE="1"
NNODES_RUN_REF2TTEN="1"
NNODES_RUN_NONVARCLDANL="1"
NNODES_RUN_GRAPHICS="1"
@@ -1713,6 +1717,7 @@ PPN_RUN_RECENTER="20"
PPN_PROC_RADAR="24"
PPN_PROC_LIGHTNING="1"
PPN_PROC_BUFR="1"
+PPN_PROC_SMOKE="1"
PPN_RUN_REF2TTEN="1"
PPN_RUN_NONVARCLDANL="1"
PPN_RUN_GRAPHICS="12"
@@ -1742,6 +1747,7 @@ WTIME_RUN_RECENTER="01:00:00"
WTIME_PROC_RADAR="00:25:00"
WTIME_PROC_LIGHTNING="00:25:00"
WTIME_PROC_BUFR="00:25:00"
+WTIME_PROC_SMOKE="00:25:00"
WTIME_RUN_REF2TTEN="00:20:00"
WTIME_RUN_NONVARCLDANL="00:20:00"
WTIME_RUN_BUFRSND="00:45:00"
@@ -1758,6 +1764,7 @@ START_TIME_LATE_ANALYSIS="01:40:00"
START_TIME_CONVENTIONAL="00:40:00"
START_TIME_NSSLMOSIAC="00:45:00"
START_TIME_LIGHTNINGNC="00:45:00"
+START_TIME_PROCSMOKE="00:45:00"
#
# Memory.
@@ -1791,6 +1798,7 @@ MAXTRIES_RECENTER="1"
MAXTRIES_PROCESS_RADARREF="1"
MAXTRIES_PROCESS_LIGHTNING="1"
MAXTRIES_PROCESS_BUFR="1"
+MAXTRIES_PROCESS_SMOKE="1"
MAXTRIES_RADAR_REF2TTEN="1"
MAXTRIES_CLDANL_NONVAR="1"
MAXTRIES_SAVE_RESTART="1"
diff --git a/ush/generate_FV3LAM_wflow.sh b/ush/generate_FV3LAM_wflow.sh
index 2c666390f..eadabcdbd 100755
--- a/ush/generate_FV3LAM_wflow.sh
+++ b/ush/generate_FV3LAM_wflow.sh
@@ -217,6 +217,7 @@ settings="\
'process_radarref': ${PROCESS_RADAR_REF_TN}
'process_lightning': ${PROCESS_LIGHTNING_TN}
'process_bufr': ${PROCESS_BUFR_TN}
+ 'process_smoke': ${PROCESS_SMOKE_TN}
'radar_refl2tten': ${RADAR_REFL2TTEN_TN}
'cldanl_nonvar': ${CLDANL_NONVAR_TN}
'run_bufrsnd_tn': ${RUN_BUFRSND_TN}
@@ -244,6 +245,7 @@ settings="\
'nnodes_proc_radar': ${NNODES_PROC_RADAR}
'nnodes_proc_lightning': ${NNODES_PROC_LIGHTNING}
'nnodes_proc_bufr': ${NNODES_PROC_BUFR}
+ 'nnodes_proc_smoke': ${NNODES_PROC_SMOKE}
'nnodes_run_ref2tten': ${NNODES_RUN_REF2TTEN}
'nnodes_run_nonvarcldanl': ${NNODES_RUN_NONVARCLDANL}
'nnodes_run_graphics': ${NNODES_RUN_GRAPHICS}
@@ -283,6 +285,7 @@ settings="\
'ppn_proc_radar': ${PPN_PROC_RADAR}
'ppn_proc_lightning': ${PPN_PROC_LIGHTNING}
'ppn_proc_bufr': ${PPN_PROC_BUFR}
+ 'ppn_proc_smoke': ${PPN_PROC_SMOKE}
'ppn_run_ref2tten': ${PPN_RUN_REF2TTEN}
'ppn_run_nonvarcldanl': ${PPN_RUN_NONVARCLDANL}
'ppn_run_graphics': ${PPN_RUN_GRAPHICS}
@@ -313,6 +316,7 @@ settings="\
'wtime_proc_radar': ${WTIME_PROC_RADAR}
'wtime_proc_lightning': ${WTIME_PROC_LIGHTNING}
'wtime_proc_bufr': ${WTIME_PROC_BUFR}
+ 'wtime_proc_smoke': ${WTIME_PROC_SMOKE}
'wtime_run_ref2tten': ${WTIME_RUN_REF2TTEN}
'wtime_run_nonvarcldanl': ${WTIME_RUN_NONVARCLDANL}
'wtime_run_bufrsnd': ${WTIME_RUN_BUFRSND}
@@ -328,6 +332,7 @@ settings="\
'start_time_conventional': ${START_TIME_CONVENTIONAL}
'start_time_nsslmosiac': ${START_TIME_NSSLMOSIAC}
'start_time_lightningnc': ${START_TIME_LIGHTNINGNC}
+ 'start_time_procsmoke': ${START_TIME_PROCSMOKE}
#
# Maximum memory for each task.
#
@@ -358,6 +363,7 @@ settings="\
'maxtries_process_radarref': ${MAXTRIES_PROCESS_RADARREF}
'maxtries_process_lightning': ${MAXTRIES_PROCESS_LIGHTNING}
'maxtries_process_bufr': ${MAXTRIES_PROCESS_BUFR}
+ 'maxtries_process_smoke': ${MAXTRIES_PROCESS_SMOKE}
'maxtries_radar_ref2tten': ${MAXTRIES_RADAR_REF2TTEN}
'maxtries_cldanl_nonvar': ${MAXTRIES_CLDANL_NONVAR}
'maxtries_save_restart': ${MAXTRIES_SAVE_RESTART}
diff --git a/ush/set_rrfs_config.sh b/ush/set_rrfs_config.sh
index c3df1efb9..94f782ca8 100644
--- a/ush/set_rrfs_config.sh
+++ b/ush/set_rrfs_config.sh
@@ -5,7 +5,7 @@ AIRCRAFT_REJECT="/home/amb-verif/acars_RR/amdar_reject_lists"
SFCOBS_USELIST="/lfs4/BMC/amb-verif/rap_ops_mesonet_uselists"
SST_ROOT="/lfs4/BMC/public/data/grids/ncep/sst/0p083deg/grib2"
GVF_ROOT="/public/data/sat/ncep/viirs/gvf/grib2"
-FIRE_RRFS_ROOT="/mnt/lfs4/BMC/nrtrr/FIX_RRFS/smoke_dust//RRFS_CONUS_3km"
+FIRE_RRFS_ROOT="/mnt/lfs4/BMC/gsd-fv3-dev/FIRE_RRFS_ROOT"
BERROR_FN="rrfs_glb_berror.l127y194.f77"
diff --git a/ush/templates/FV3LAM_wflow.xml b/ush/templates/FV3LAM_wflow.xml
index 8436b0fb5..e8f790a82 100644
--- a/ush/templates/FV3LAM_wflow.xml
+++ b/ush/templates/FV3LAM_wflow.xml
@@ -57,6 +57,7 @@ Workflow task names.
+
@@ -69,6 +70,7 @@ Workflow task names.
+
@@ -182,6 +184,7 @@ tasks; and the "FCST" type is used for the RUN_FCST_TN task.
+
{%- if do_retro %}
@@ -995,6 +998,43 @@ MODULES_RUN_TASK_FP script.
prod
{%- endif %}
+{%- if do_smoke_dust %}
+
+
+
+ &RSRV_DEFAULT;
+ &WALL_LIMIT_ANAL;
+
+ &LOAD_MODULES_RUN_TASK_FP; "&RUN_SMOKE_TN;" "&JOBSDIR;/JREGIONAL_PROCESS_SMOKE"
+
+ {{ nnodes_proc_smoke }}:ppn={{ ppn_proc_smoke }}
+ {{ wtime_proc_smoke }}
+ 80G
+ &NCORES_PER_NODE;
+ &TAG;_&PROCESS_SMOKE_TN;_#type#
+ &LOGDIR;/&PROCESS_SMOKE_TN;_#type#_@Y@m@d@H.log
+
+ GLOBAL_VAR_DEFNS_FP&GLOBAL_VAR_DEFNS_FP;
+ PDY@Y@m@d
+ CDATE@Y@m@d@H
+ CDATE@Y@m@d@H
+ CYCLE_DIR&CYCLE_BASEDIR;/@Y@m@d@H
+ CYCLE_TYPE#type#
+ NWGES_BASEDIR&NWGES_BASEDIR;
+ NWGES_DIR&NWGES_BASEDIR;
+
+
+
+ @Y@m@d@H@M00
+
+
+
+
+{%- endif %}
+
{%- if do_nonvar_cldanal or do_refl2tten or do_enkf_radar_ref or do_envar_radar_ref %}