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 %}