From 36e0c265298cb12d92208b2c29b6fac611e0e576 Mon Sep 17 00:00:00 2001 From: David Gill Date: Mon, 22 Mar 2010 15:17:29 +0000 Subject: [PATCH] Files impacted: D test/em_fire/input_sounding D test/em_fire/namelist.input M phys/module_physics_init.F M phys/module_fddaobs_driver.F M phys/module_fddaobs_rtfdda.F M phys/module_fr_sfire_driver.F M phys/module_fr_sfire_model.F M phys/module_fdda_psufddagd.F M share/wrf_fddaobs_in.F M Registry/Registry.EM_SST M Registry/Registry.EM_CHEM M Registry/Registry.EM M Registry/registry.dimspec M Registry/Registry.wrfvar M dyn_em/module_initialize_real.F M dyn_em/start_em.F 1) send a note out to users concerning max map factors in d01 in the real program ARW only, no changes in results M dyn_em/module_initialize_real.F 2) allow users to get the dominant category for vegetables and soil from the fields in geogrid ARW only, a new nml option setting, no changes in results with orig values (mods to ARW's GEOGRID.TBL files) M dyn_em/module_initialize_real.F 3a) obs nudging fixes from Al Bourgeois Fix default values for Regime-4 vertical scaling, Add stnidprt, needed for proper obs diagnostic report, Add obsstid for dimensioning stnidprt M Registry/Registry.EM_SST M Registry/Registry.EM_CHEM M Registry/Registry.EM M Registry/registry.dimspec 3b) Overhaul diagnostics to fix potential for bad indices into print arrays when handling soundings. Clarify a few user messages. M share/wrf_fddaobs_in.F 3c) Add stnidprt, needed for proper obs diagnostic report, M phys/module_fddaobs_driver.F 3d) Add individual nudge flags to fdaobs_init, needed to correct/clarify user messages. Fix/improve printouts for vertical influence function settings. Add stnid_prt. M phys/module_fddaobs_rtfdda.F 3e) Add individual nudge flags to pass to fddaobs_init M phys/module_physics_init.F 4a) Fire updates to allow restarts ARW only, no changes for results M phys/module_fr_sfire_driver.F M phys/module_fr_sfire_model.F 4b) remove the wrong namelist.input and sounding for ideal M test/em_fire/input_sounding M test/em_fire/namelist.input 5) vertically interpolate RH, not Qv ARW only, changes results, need to use diagnosed Qv (with dry pressure) for initialization, Qv from RH with full pressure added at end of routine M dyn_em/module_initialize_real.F 6) if surface values are missing, set use_surface flag to false ARW only, changes results, changes to ARW METGRID.TBL files M dyn_em/module_initialize_real.F 7) initialize half-level hydrostatic pressure for 0-h output, if no restart ARW only, diagnostic only M dyn_em/start_em.F 8) analysis nudging smoother goes out of bounds, reduce indexing bounds by 1 on all sides ARW only, changes results M phys/module_fdda_psufddagd.F 9) insure vertical interpolation array has top pressure value with close vertical spacing ARW only, NaNs if you hit this, big zap_close_levels and small delta press levels cause trouble M dyn_em/module_initialize_real.F 10) input RH to real constrained: if( (p<100 mb) and (rh>0.1%)), then assign rh = 1.e-5% ARW only, changes results M dyn_em/module_initialize_real.F git-svn-id: https://svn-wrf-model.cgd.ucar.edu/trunk@4254 b0b5d27b-6f0f-0410-a2a3-cb1e977edc3d --- Registry/Registry.EM | 19 +- Registry/Registry.EM_CHEM | 19 +- Registry/Registry.EM_SST | 19 +- Registry/Registry.wrfvar | 19 +- Registry/registry.dimspec | 1 + dyn_em/module_initialize_real.F | 248 +++++++++++++++++++---- dyn_em/start_em.F | 2 + phys/module_fdda_psufddagd.F | 4 +- phys/module_fddaobs_driver.F | 14 +- phys/module_fddaobs_rtfdda.F | 200 ++++++++++-------- phys/module_fr_sfire_driver.F | 30 ++- phys/module_fr_sfire_model.F | 13 +- phys/module_physics_init.F | 8 + share/wrf_fddaobs_in.F | 347 +++++++++++--------------------- test/em_fire/input_sounding | 48 ----- test/em_fire/namelist.input | 183 ----------------- 16 files changed, 545 insertions(+), 629 deletions(-) delete mode 100644 test/em_fire/input_sounding delete mode 100644 test/em_fire/namelist.input diff --git a/Registry/Registry.EM b/Registry/Registry.EM index 704a47f0c4..d021f101d4 100644 --- a/Registry/Registry.EM +++ b/Registry/Registry.EM @@ -95,6 +95,8 @@ state real tsk_gc ij dyn_em 1 - i1 "SKINTEMP state real tavgsfc ij dyn_em 1 - i1 "TAVGSFC" "daily mean of surface air temperature" "K" state real tmn_gc ij dyn_em 1 - i1 "SOILTEMP" "annual mean deep soil temperature" "K" state real pslv_gc ij dyn_em 1 - i1 "PMSL" "sea level pressure" "Pa" +state real sct_dom_gc ij dyn_em 1 - i1 "SCT_DOM" "Dominant soil (top) category from GEOGRID" "cat" +state real scb_dom_gc ij dyn_em 1 - i1 "SCB_DOM" "Dominant soil (bottom) category from GEOGRID" "cat" state real greenfrac imj dyn_em 1 Z i1 "GREENFRAC" "monthly greenness fraction" "0 - 1 fraction" state real albedo12m imj dyn_em 1 Z i1 "ALBEDO12M" "background albedo" "0 - 1 fraction" state real pd_gc igj dyn_em 1 Z - "PD" "dry pressure" "Pa" @@ -1507,20 +1509,20 @@ rconfig real obs_nudgezfullr1_uv namelist,fdda 1 rconfig real obs_nudgezrampr1_uv namelist,fdda 1 50 rh "obs_nudgezrampr1_uv" "Vert infl ramp-to-zero height for LML obs, regime 1, winds" "" rconfig real obs_nudgezfullr2_uv namelist,fdda 1 50 rh "obs_nudgezfullr2_uv" "Vert infl full weight height for LML obs, regime 2, winds" "" rconfig real obs_nudgezrampr2_uv namelist,fdda 1 50 rh "obs_nudgezrampr2_uv" "Vert infl ramp-to-zero height for LML obs, regime 2, winds" "" -rconfig real obs_nudgezfullr4_uv namelist,fdda 1 50 rh "obs_nudgezfullr4_uv" "Vert infl full weight height for LML obs, regime 4, winds" "" -rconfig real obs_nudgezrampr4_uv namelist,fdda 1 -5000 rh "obs_nudgezrampr4_uv" "Vert infl ramp-to-zero height for LML obs, regime 4, winds" "" +rconfig real obs_nudgezfullr4_uv namelist,fdda 1 -5000 rh "obs_nudgezfullr4_uv" "Vert infl full weight height for LML obs, regime 4, winds" "" +rconfig real obs_nudgezrampr4_uv namelist,fdda 1 50 rh "obs_nudgezrampr4_uv" "Vert infl ramp-to-zero height for LML obs, regime 4, winds" "" rconfig real obs_nudgezfullr1_t namelist,fdda 1 50 rh "obs_nudgezfullr1_t" "Vert infl full weight height for LML obs, regime 1, temperature" "" rconfig real obs_nudgezrampr1_t namelist,fdda 1 50 rh "obs_nudgezrampr1_t" "Vert infl ramp-to-zero height for LML obs, regime 1, temperature" "" rconfig real obs_nudgezfullr2_t namelist,fdda 1 50 rh "obs_nudgezfullr2_t" "Vert infl full weight height for LML obs, regime 2, temperature" "" rconfig real obs_nudgezrampr2_t namelist,fdda 1 50 rh "obs_nudgezrampr2_t" "Vert infl ramp-to-zero height for LML obs, regime 2, temperature" "" -rconfig real obs_nudgezfullr4_t namelist,fdda 1 50 rh "obs_nudgezfullr4_t" "Vert infl full weight height for LML obs, regime 4, temperature" "" -rconfig real obs_nudgezrampr4_t namelist,fdda 1 -5000 rh "obs_nudgezrampr4_t" "Vert infl ramp-to-zero height for LML obs, regime 4, temperature" "" +rconfig real obs_nudgezfullr4_t namelist,fdda 1 -5000 rh "obs_nudgezfullr4_t" "Vert infl full weight height for LML obs, regime 4, temperature" "" +rconfig real obs_nudgezrampr4_t namelist,fdda 1 50 rh "obs_nudgezrampr4_t" "Vert infl ramp-to-zero height for LML obs, regime 4, temperature" "" rconfig real obs_nudgezfullr1_q namelist,fdda 1 50 rh "obs_nudgezfullr1_q" "Vert infl full weight height for LML obs, regime 1, moisture" "" rconfig real obs_nudgezrampr1_q namelist,fdda 1 50 rh "obs_nudgezrampr1_q" "Vert infl ramp-to-zero height for LML obs, regime 1, moisture" "" rconfig real obs_nudgezfullr2_q namelist,fdda 1 50 rh "obs_nudgezfullr2_q" "Vert infl full weight height for LML obs, regime 2, moisture" "" rconfig real obs_nudgezrampr2_q namelist,fdda 1 50 rh "obs_nudgezrampr2_q" "Vert infl ramp-to-zero height for LML obs, regime 2, moisture" "" -rconfig real obs_nudgezfullr4_q namelist,fdda 1 50 rh "obs_nudgezfullr4_q" "Vert infl full weight height for LML obs, regime 4, moisture" "" -rconfig real obs_nudgezrampr4_q namelist,fdda 1 -5000 rh "obs_nudgezrampr4_q" "Vert infl ramp-to-zero height for LML obs, regime 4, moisture" "" +rconfig real obs_nudgezfullr4_q namelist,fdda 1 -5000 rh "obs_nudgezfullr4_q" "Vert infl full weight height for LML obs, regime 4, moisture" "" +rconfig real obs_nudgezrampr4_q namelist,fdda 1 50 rh "obs_nudgezrampr4_q" "Vert infl ramp-to-zero height for LML obs, regime 4, moisture" "" rconfig real obs_nudgezfullmin namelist,fdda 1 50 rh "obs_nudgezfullmin" "Minimum depth through which vertical influence fcn remains 1.0" "m" rconfig real obs_nudgezrampmin namelist,fdda 1 50 rh "obs_nudgezrampmin" "Minimum depth through which vertical influence fcn decreases from 1.0 to 0.0" "m" rconfig real obs_nudgezmax namelist,fdda 1 3000 rh "obs_nudgezmax" "Maximum depth in which vertical influence function is nonzero" "m" @@ -1800,10 +1802,10 @@ package dfi_dfl dfi_opt==1 - state:dfi_u,df package dfi_ddfi dfi_opt==2 - state:dfi_u,dfi_v,dfi_w,dfi_ph,dfi_phb,dfi_ph0,dfi_php,dfi_t,dfi_p,dfi_ww,dfi_mu,dfi_tke,dfi_pb,dfi_al,dfi_alt,dfi_TSLB,dfi_SMOIS,dfi_SNOW,dfi_SNOWH,dfi_CANWAT,dfi_SMFR3D,dfi_KEEPFR3DFLAG,dfi_TSK,dfi_SOILT1,dfi_TSNAV,dfi_SNOWC,dfi_QVG,dfi_rh,dfi_tten_rad package dfi_tdfi dfi_opt==3 - state:dfi_u,dfi_v,dfi_w,dfi_ph,dfi_phb,dfi_ph0,dfi_php,dfi_t,dfi_p,dfi_ww,dfi_mu,dfi_tke,dfi_pb,dfi_al,dfi_alt,dfi_TSLB,dfi_SMOIS,dfi_SNOW,dfi_SNOWH,dfi_CANWAT,dfi_SMFR3D,dfi_KEEPFR3DFLAG,dfi_TSK,dfi_SOILT1,dfi_TSNAV,dfi_SNOWC,dfi_QVG,dfi_rh,dfi_tten_rad ifdef RUC_CLOUD -package realonly use_wps_input==1 - state:u_gc,v_gc,t_gc,rh_gc,ght_gc,p_gc,xlat_gc,xlong_gc,ht_gc,tsk_gc,tavgsfc,tmn_gc,pslv_gc,greenfrac,albedo12m,pd_gc,psfc_gc,intq_gc,pdhs,sh_gc,qv_gc,qr_gc,qc_gc,qs_gc,qi_gc,qg_gc,qni_gc +package realonly use_wps_input==1 - state:u_gc,v_gc,t_gc,rh_gc,ght_gc,p_gc,xlat_gc,xlong_gc,ht_gc,tsk_gc,tavgsfc,tmn_gc,pslv_gc,sct_dom_gc,scb_dom_gc,greenfrac,albedo12m,pd_gc,psfc_gc,intq_gc,pdhs,sh_gc,qv_gc,qr_gc,qc_gc,qs_gc,qi_gc,qg_gc,qni_gc endif ifndef RUC_CLOUD -package realonly use_wps_input==1 - state:u_gc,v_gc,t_gc,rh_gc,ght_gc,p_gc,xlat_gc,xlong_gc,ht_gc,tsk_gc,tavgsfc,tmn_gc,pslv_gc,greenfrac,albedo12m,pd_gc,psfc_gc,intq_gc,pdhs,sh_gc,qv_gc +package realonly use_wps_input==1 - state:u_gc,v_gc,t_gc,rh_gc,ght_gc,p_gc,xlat_gc,xlong_gc,ht_gc,tsk_gc,tavgsfc,tmn_gc,pslv_gc,sct_dom_gc,scb_dom_gc,greenfrac,albedo12m,pd_gc,psfc_gc,intq_gc,pdhs,sh_gc,qv_gc endif @@ -2006,6 +2008,7 @@ typedef fdob_type real latprt [ - 1 - typedef fdob_type real lonprt [ - 1 - - "lonprt" "obs longitude for diagnostic printout" typedef fdob_type real mlatprt [ - 1 - - "mlatprt" "model latitude at obs location" typedef fdob_type real mlonprt [ - 1 - - "mlonprt" "model longitude at obs location" +typedef fdob_type integer stnidprt {obsstid}{[} - 1 - - "stnidprt" "obs station id for diagnostic printout" typedef fdob_type real base_state k - 1 - - "base_state" "base-state height on half (mass) levels" "meters" state fdob_type fdob - - diff --git a/Registry/Registry.EM_CHEM b/Registry/Registry.EM_CHEM index 28295a443c..5171c6793a 100644 --- a/Registry/Registry.EM_CHEM +++ b/Registry/Registry.EM_CHEM @@ -88,6 +88,8 @@ state real tsk_gc ij dyn_em 1 - i1 "SKINTEMP state real tavgsfc ij dyn_em 1 - i1 "TAVGSFC" "daily mean of surface air temperature" "K" state real tmn_gc ij dyn_em 1 - i1 "SOILTEMP" "annual mean deep soil temperature" "K" state real pslv_gc ij dyn_em 1 - i1 "PMSL" "sea level pressure" "Pa" +state real sct_dom_gc ij dyn_em 1 - i1 "SCT_DOM" "Dominant soil (top) category from GEOGRID" "cat" +state real scb_dom_gc ij dyn_em 1 - i1 "SCB_DOM" "Dominant soil (bottom) category from GEOGRID" "cat" state real greenfrac imj dyn_em 1 Z i1 "GREENFRAC" "monthly greenness fraction" "0 - 1 fraction" state real albedo12m imj dyn_em 1 Z i1 "ALBEDO12M" "background albedo" "0 - 1 fraction" state real pd_gc igj dyn_em 1 Z - "PD" "dry pressure" "Pa" @@ -1481,20 +1483,20 @@ rconfig real obs_nudgezfullr1_uv namelist,fdda 1 rconfig real obs_nudgezrampr1_uv namelist,fdda 1 50 rh "obs_nudgezrampr1_uv" "Vert infl ramp-to-zero height for LML obs, regime 1, winds" "" rconfig real obs_nudgezfullr2_uv namelist,fdda 1 50 rh "obs_nudgezfullr2_uv" "Vert infl full weight height for LML obs, regime 2, winds" "" rconfig real obs_nudgezrampr2_uv namelist,fdda 1 50 rh "obs_nudgezrampr2_uv" "Vert infl ramp-to-zero height for LML obs, regime 2, winds" "" -rconfig real obs_nudgezfullr4_uv namelist,fdda 1 50 rh "obs_nudgezfullr4_uv" "Vert infl full weight height for LML obs, regime 4, winds" "" -rconfig real obs_nudgezrampr4_uv namelist,fdda 1 -5000 rh "obs_nudgezrampr4_uv" "Vert infl ramp-to-zero height for LML obs, regime 4, winds" "" +rconfig real obs_nudgezfullr4_uv namelist,fdda 1 -5000 rh "obs_nudgezfullr4_uv" "Vert infl full weight height for LML obs, regime 4, winds" "" +rconfig real obs_nudgezrampr4_uv namelist,fdda 1 50 rh "obs_nudgezrampr4_uv" "Vert infl ramp-to-zero height for LML obs, regime 4, winds" "" rconfig real obs_nudgezfullr1_t namelist,fdda 1 50 rh "obs_nudgezfullr1_t" "Vert infl full weight height for LML obs, regime 1, temperature" "" rconfig real obs_nudgezrampr1_t namelist,fdda 1 50 rh "obs_nudgezrampr1_t" "Vert infl ramp-to-zero height for LML obs, regime 1, temperature" "" rconfig real obs_nudgezfullr2_t namelist,fdda 1 50 rh "obs_nudgezfullr2_t" "Vert infl full weight height for LML obs, regime 2, temperature" "" rconfig real obs_nudgezrampr2_t namelist,fdda 1 50 rh "obs_nudgezrampr2_t" "Vert infl ramp-to-zero height for LML obs, regime 2, temperature" "" -rconfig real obs_nudgezfullr4_t namelist,fdda 1 50 rh "obs_nudgezfullr4_t" "Vert infl full weight height for LML obs, regime 4, temperature" "" -rconfig real obs_nudgezrampr4_t namelist,fdda 1 -5000 rh "obs_nudgezrampr4_t" "Vert infl ramp-to-zero height for LML obs, regime 4, temperature" "" +rconfig real obs_nudgezfullr4_t namelist,fdda 1 -5000 rh "obs_nudgezfullr4_t" "Vert infl full weight height for LML obs, regime 4, temperature" "" +rconfig real obs_nudgezrampr4_t namelist,fdda 1 50 rh "obs_nudgezrampr4_t" "Vert infl ramp-to-zero height for LML obs, regime 4, temperature" "" rconfig real obs_nudgezfullr1_q namelist,fdda 1 50 rh "obs_nudgezfullr1_q" "Vert infl full weight height for LML obs, regime 1, moisture" "" rconfig real obs_nudgezrampr1_q namelist,fdda 1 50 rh "obs_nudgezrampr1_q" "Vert infl ramp-to-zero height for LML obs, regime 1, moisture" "" rconfig real obs_nudgezfullr2_q namelist,fdda 1 50 rh "obs_nudgezfullr2_q" "Vert infl full weight height for LML obs, regime 2, moisture" "" rconfig real obs_nudgezrampr2_q namelist,fdda 1 50 rh "obs_nudgezrampr2_q" "Vert infl ramp-to-zero height for LML obs, regime 2, moisture" "" -rconfig real obs_nudgezfullr4_q namelist,fdda 1 50 rh "obs_nudgezfullr4_q" "Vert infl full weight height for LML obs, regime 4, moisture" "" -rconfig real obs_nudgezrampr4_q namelist,fdda 1 -5000 rh "obs_nudgezrampr4_q" "Vert infl ramp-to-zero height for LML obs, regime 4, moisture" "" +rconfig real obs_nudgezfullr4_q namelist,fdda 1 -5000 rh "obs_nudgezfullr4_q" "Vert infl full weight height for LML obs, regime 4, moisture" "" +rconfig real obs_nudgezrampr4_q namelist,fdda 1 50 rh "obs_nudgezrampr4_q" "Vert infl ramp-to-zero height for LML obs, regime 4, moisture" "" rconfig real obs_nudgezfullmin namelist,fdda 1 50 rh "obs_nudgezfullmin" "Minimum depth through which vertical influence fcn remains 1.0" "m" rconfig real obs_nudgezrampmin namelist,fdda 1 50 rh "obs_nudgezrampmin" "Minimum depth through which vertical influence fcn decreases from 1.0 to 0.0" "m" rconfig real obs_nudgezmax namelist,fdda 1 3000 rh "obs_nudgezmax" "Maximum depth in which vertical influence function is nonzero" "m" @@ -1772,10 +1774,10 @@ package dfi_dfl dfi_opt==1 - state:dfi_u,df package dfi_ddfi dfi_opt==2 - state:dfi_u,dfi_v,dfi_w,dfi_ph,dfi_phb,dfi_ph0,dfi_php,dfi_t,dfi_p,dfi_ww,dfi_mu,dfi_tke,dfi_pb,dfi_al,dfi_alt,dfi_TSLB,dfi_SMOIS,dfi_SNOW,dfi_SNOWH,dfi_CANWAT,dfi_SMFR3D,dfi_KEEPFR3DFLAG,dfi_TSK,dfi_SOILT1,dfi_TSNAV,dfi_SNOWC,dfi_QVG,dfi_rh,dfi_tten_rad package dfi_tdfi dfi_opt==3 - state:dfi_u,dfi_v,dfi_w,dfi_ph,dfi_phb,dfi_ph0,dfi_php,dfi_t,dfi_p,dfi_ww,dfi_mu,dfi_tke,dfi_pb,dfi_al,dfi_alt,dfi_TSLB,dfi_SMOIS,dfi_SNOW,dfi_SNOWH,dfi_CANWAT,dfi_SMFR3D,dfi_KEEPFR3DFLAG,dfi_TSK,dfi_SOILT1,dfi_TSNAV,dfi_SNOWC,dfi_QVG,dfi_rh,dfi_tten_rad ifdef RUC_CLOUD -package realonly use_wps_input==1 - state:u_gc,v_gc,t_gc,rh_gc,ght_gc,p_gc,xlat_gc,xlong_gc,ht_gc,tsk_gc,tavgsfc,tmn_gc,pslv_gc,greenfrac,albedo12m,pd_gc,psfc_gc,intq_gc,pdhs,sh_gc,qv_gc,qr_gc,qc_gc,qs_gc,qi_gc,qg_gc,qni_gc +package realonly use_wps_input==1 - state:u_gc,v_gc,t_gc,rh_gc,ght_gc,p_gc,xlat_gc,xlong_gc,ht_gc,tsk_gc,tavgsfc,tmn_gc,pslv_gc,sct_dom_gc,scb_dom_gc,greenfrac,albedo12m,pd_gc,psfc_gc,intq_gc,pdhs,sh_gc,qv_gc,qr_gc,qc_gc,qs_gc,qi_gc,qg_gc,qni_gc endif ifndef RUC_CLOUD -package realonly use_wps_input==1 - state:u_gc,v_gc,t_gc,rh_gc,ght_gc,p_gc,xlat_gc,xlong_gc,ht_gc,tsk_gc,tavgsfc,tmn_gc,pslv_gc,greenfrac,albedo12m,pd_gc,psfc_gc,intq_gc,pdhs,sh_gc,qv_gc +package realonly use_wps_input==1 - state:u_gc,v_gc,t_gc,rh_gc,ght_gc,p_gc,xlat_gc,xlong_gc,ht_gc,tsk_gc,tavgsfc,tmn_gc,pslv_gc,sct_dom_gc,scb_dom_gc,greenfrac,albedo12m,pd_gc,psfc_gc,intq_gc,pdhs,sh_gc,qv_gc endif # only need to specify these once; not for every io_form* variable @@ -1977,6 +1979,7 @@ typedef fdob_type real latprt [ - 1 - typedef fdob_type real lonprt [ - 1 - - "lonprt" "obs longitude for diagnostic printout" typedef fdob_type real mlatprt [ - 1 - - "mlatprt" "model latitude at obs location" typedef fdob_type real mlonprt [ - 1 - - "mlonprt" "model longitude at obs location" +typedef fdob_type integer stnidprt {obsstid}{[} - 1 - - "stnidprt" "obs station id for diagnostic printout" typedef fdob_type real base_state k - 1 - - "base_state" "base-state height on half (mass) levels" "meters" state fdob_type fdob - - diff --git a/Registry/Registry.EM_SST b/Registry/Registry.EM_SST index a200e48e93..e392d16d1c 100644 --- a/Registry/Registry.EM_SST +++ b/Registry/Registry.EM_SST @@ -95,6 +95,8 @@ state real tsk_gc ij dyn_em 1 - i1 "SKINTEMP state real tavgsfc ij dyn_em 1 - i1 "TAVGSFC" "daily mean of surface air temperature" "K" state real tmn_gc ij dyn_em 1 - i1 "SOILTEMP" "annual mean deep soil temperature" "K" state real pslv_gc ij dyn_em 1 - i1 "PMSL" "sea level pressure" "Pa" +state real sct_dom_gc ij dyn_em 1 - i1 "SCT_DOM" "Dominant soil (top) category from GEOGRID" "cat" +state real scb_dom_gc ij dyn_em 1 - i1 "SCB_DOM" "Dominant soil (bottom) category from GEOGRID" "cat" state real greenfrac imj dyn_em 1 Z i1 "GREENFRAC" "monthly greenness fraction" "0 - 1 fraction" state real albedo12m imj dyn_em 1 Z i1 "ALBEDO12M" "background albedo" "0 - 1 fraction" state real pd_gc igj dyn_em 1 Z - "PD" "dry pressure" "Pa" @@ -1512,20 +1514,20 @@ rconfig real obs_nudgezfullr1_uv namelist,fdda 1 rconfig real obs_nudgezrampr1_uv namelist,fdda 1 50 rh "obs_nudgezrampr1_uv" "Vert infl ramp-to-zero height for LML obs, regime 1, winds" "" rconfig real obs_nudgezfullr2_uv namelist,fdda 1 50 rh "obs_nudgezfullr2_uv" "Vert infl full weight height for LML obs, regime 2, winds" "" rconfig real obs_nudgezrampr2_uv namelist,fdda 1 50 rh "obs_nudgezrampr2_uv" "Vert infl ramp-to-zero height for LML obs, regime 2, winds" "" -rconfig real obs_nudgezfullr4_uv namelist,fdda 1 50 rh "obs_nudgezfullr4_uv" "Vert infl full weight height for LML obs, regime 4, winds" "" -rconfig real obs_nudgezrampr4_uv namelist,fdda 1 -5000 rh "obs_nudgezrampr4_uv" "Vert infl ramp-to-zero height for LML obs, regime 4, winds" "" +rconfig real obs_nudgezfullr4_uv namelist,fdda 1 -5000 rh "obs_nudgezfullr4_uv" "Vert infl full weight height for LML obs, regime 4, winds" "" +rconfig real obs_nudgezrampr4_uv namelist,fdda 1 50 rh "obs_nudgezrampr4_uv" "Vert infl ramp-to-zero height for LML obs, regime 4, winds" "" rconfig real obs_nudgezfullr1_t namelist,fdda 1 50 rh "obs_nudgezfullr1_t" "Vert infl full weight height for LML obs, regime 1, temperature" "" rconfig real obs_nudgezrampr1_t namelist,fdda 1 50 rh "obs_nudgezrampr1_t" "Vert infl ramp-to-zero height for LML obs, regime 1, temperature" "" rconfig real obs_nudgezfullr2_t namelist,fdda 1 50 rh "obs_nudgezfullr2_t" "Vert infl full weight height for LML obs, regime 2, temperature" "" rconfig real obs_nudgezrampr2_t namelist,fdda 1 50 rh "obs_nudgezrampr2_t" "Vert infl ramp-to-zero height for LML obs, regime 2, temperature" "" -rconfig real obs_nudgezfullr4_t namelist,fdda 1 50 rh "obs_nudgezfullr4_t" "Vert infl full weight height for LML obs, regime 4, temperature" "" -rconfig real obs_nudgezrampr4_t namelist,fdda 1 -5000 rh "obs_nudgezrampr4_t" "Vert infl ramp-to-zero height for LML obs, regime 4, temperature" "" +rconfig real obs_nudgezfullr4_t namelist,fdda 1 -5000 rh "obs_nudgezfullr4_t" "Vert infl full weight height for LML obs, regime 4, temperature" "" +rconfig real obs_nudgezrampr4_t namelist,fdda 1 50 rh "obs_nudgezrampr4_t" "Vert infl ramp-to-zero height for LML obs, regime 4, temperature" "" rconfig real obs_nudgezfullr1_q namelist,fdda 1 50 rh "obs_nudgezfullr1_q" "Vert infl full weight height for LML obs, regime 1, moisture" "" rconfig real obs_nudgezrampr1_q namelist,fdda 1 50 rh "obs_nudgezrampr1_q" "Vert infl ramp-to-zero height for LML obs, regime 1, moisture" "" rconfig real obs_nudgezfullr2_q namelist,fdda 1 50 rh "obs_nudgezfullr2_q" "Vert infl full weight height for LML obs, regime 2, moisture" "" rconfig real obs_nudgezrampr2_q namelist,fdda 1 50 rh "obs_nudgezrampr2_q" "Vert infl ramp-to-zero height for LML obs, regime 2, moisture" "" -rconfig real obs_nudgezfullr4_q namelist,fdda 1 50 rh "obs_nudgezfullr4_q" "Vert infl full weight height for LML obs, regime 4, moisture" "" -rconfig real obs_nudgezrampr4_q namelist,fdda 1 -5000 rh "obs_nudgezrampr4_q" "Vert infl ramp-to-zero height for LML obs, regime 4, moisture" "" +rconfig real obs_nudgezfullr4_q namelist,fdda 1 -5000 rh "obs_nudgezfullr4_q" "Vert infl full weight height for LML obs, regime 4, moisture" "" +rconfig real obs_nudgezrampr4_q namelist,fdda 1 50 rh "obs_nudgezrampr4_q" "Vert infl ramp-to-zero height for LML obs, regime 4, moisture" "" rconfig real obs_nudgezfullmin namelist,fdda 1 50 rh "obs_nudgezfullmin" "Minimum depth through which vertical influence fcn remains 1.0" "m" rconfig real obs_nudgezrampmin namelist,fdda 1 50 rh "obs_nudgezrampmin" "Minimum depth through which vertical influence fcn decreases from 1.0 to 0.0" "m" rconfig real obs_nudgezmax namelist,fdda 1 3000 rh "obs_nudgezmax" "Maximum depth in which vertical influence function is nonzero" "m" @@ -1806,10 +1808,10 @@ package dfi_dfl dfi_opt==1 - state:dfi_u,df package dfi_ddfi dfi_opt==2 - state:dfi_u,dfi_v,dfi_w,dfi_ph,dfi_phb,dfi_ph0,dfi_php,dfi_t,dfi_p,dfi_ww,dfi_mu,dfi_tke,dfi_pb,dfi_al,dfi_alt,dfi_TSLB,dfi_SMOIS,dfi_SNOW,dfi_SNOWH,dfi_CANWAT,dfi_SMFR3D,dfi_KEEPFR3DFLAG,dfi_TSK,dfi_SOILT1,dfi_TSNAV,dfi_SNOWC,dfi_QVG,dfi_rh,dfi_tten_rad package dfi_tdfi dfi_opt==3 - state:dfi_u,dfi_v,dfi_w,dfi_ph,dfi_phb,dfi_ph0,dfi_php,dfi_t,dfi_p,dfi_ww,dfi_mu,dfi_tke,dfi_pb,dfi_al,dfi_alt,dfi_TSLB,dfi_SMOIS,dfi_SNOW,dfi_SNOWH,dfi_CANWAT,dfi_SMFR3D,dfi_KEEPFR3DFLAG,dfi_TSK,dfi_SOILT1,dfi_TSNAV,dfi_SNOWC,dfi_QVG,dfi_rh,dfi_tten_rad ifdef RUC_CLOUD -package realonly use_wps_input==1 - state:u_gc,v_gc,t_gc,rh_gc,ght_gc,p_gc,xlat_gc,xlong_gc,ht_gc,tsk_gc,tavgsfc,tmn_gc,pslv_gc,greenfrac,albedo12m,pd_gc,psfc_gc,intq_gc,pdhs,sh_gc,qv_gc,qr_gc,qc_gc,qs_gc,qi_gc,qg_gc,qni_gc +package realonly use_wps_input==1 - state:u_gc,v_gc,t_gc,rh_gc,ght_gc,p_gc,xlat_gc,xlong_gc,ht_gc,tsk_gc,tavgsfc,tmn_gc,pslv_gc,sct_dom_gc,scb_dom_gc,greenfrac,albedo12m,pd_gc,psfc_gc,intq_gc,pdhs,sh_gc,qv_gc,qr_gc,qc_gc,qs_gc,qi_gc,qg_gc,qni_gc endif ifndef RUC_CLOUD -package realonly use_wps_input==1 - state:u_gc,v_gc,t_gc,rh_gc,ght_gc,p_gc,xlat_gc,xlong_gc,ht_gc,tsk_gc,tavgsfc,tmn_gc,pslv_gc,greenfrac,albedo12m,pd_gc,psfc_gc,intq_gc,pdhs,sh_gc,qv_gc +package realonly use_wps_input==1 - state:u_gc,v_gc,t_gc,rh_gc,ght_gc,p_gc,xlat_gc,xlong_gc,ht_gc,tsk_gc,tavgsfc,tmn_gc,pslv_gc,sct_dom_gc,scb_dom_gc,greenfrac,albedo12m,pd_gc,psfc_gc,intq_gc,pdhs,sh_gc,qv_gc endif @@ -2012,6 +2014,7 @@ typedef fdob_type real latprt [ - 1 - typedef fdob_type real lonprt [ - 1 - - "lonprt" "obs longitude for diagnostic printout" typedef fdob_type real mlatprt [ - 1 - - "mlatprt" "model latitude at obs location" typedef fdob_type real mlonprt [ - 1 - - "mlonprt" "model longitude at obs location" +typedef fdob_type integer stnidprt {obsstid}{[} - 1 - - "stnidprt" "obs station id for diagnostic printout" typedef fdob_type real base_state k - 1 - - "base_state" "base-state height on half (mass) levels" "meters" state fdob_type fdob - - diff --git a/Registry/Registry.wrfvar b/Registry/Registry.wrfvar index e9c1a5a33b..9a7c36d623 100644 --- a/Registry/Registry.wrfvar +++ b/Registry/Registry.wrfvar @@ -95,6 +95,8 @@ state real tsk_gc ij dyn_em 1 - i1 "SKINTEMP state real tavgsfc ij dyn_em 1 - i1 "TAVGSFC" "daily mean of surface air temperature" "K" state real tmn_gc ij dyn_em 1 - i1 "SOILTEMP" "annual mean deep soil temperature" "K" state real pslv_gc ij dyn_em 1 - i1 "PMSL" "sea level pressure" "Pa" +state real sct_dom_gc ij dyn_em 1 - i1 "SCT_DOM" "Dominant soil (top) category from GEOGRID" "cat" +state real scb_dom_gc ij dyn_em 1 - i1 "SCB_DOM" "Dominant soil (bottom) category from GEOGRID" "cat" state real greenfrac imj dyn_em 1 Z i1 "GREENFRAC" "monthly greenness fraction" "0 - 1 fraction" state real albedo12m imj dyn_em 1 Z i1 "ALBEDO12M" "background albedo" "0 - 1 fraction" state real pd_gc igj dyn_em 1 Z - "PD" "dry pressure" "Pa" @@ -1809,20 +1811,20 @@ rconfig real obs_nudgezfullr1_uv namelist,fdda 1 rconfig real obs_nudgezrampr1_uv namelist,fdda 1 50 rh "obs_nudgezrampr1_uv" "Vert infl ramp-to-zero height for LML obs, regime 1, winds" "" rconfig real obs_nudgezfullr2_uv namelist,fdda 1 50 rh "obs_nudgezfullr2_uv" "Vert infl full weight height for LML obs, regime 2, winds" "" rconfig real obs_nudgezrampr2_uv namelist,fdda 1 50 rh "obs_nudgezrampr2_uv" "Vert infl ramp-to-zero height for LML obs, regime 2, winds" "" -rconfig real obs_nudgezfullr4_uv namelist,fdda 1 50 rh "obs_nudgezfullr4_uv" "Vert infl full weight height for LML obs, regime 4, winds" "" -rconfig real obs_nudgezrampr4_uv namelist,fdda 1 -5000 rh "obs_nudgezrampr4_uv" "Vert infl ramp-to-zero height for LML obs, regime 4, winds" "" +rconfig real obs_nudgezfullr4_uv namelist,fdda 1 -5000 rh "obs_nudgezfullr4_uv" "Vert infl full weight height for LML obs, regime 4, winds" "" +rconfig real obs_nudgezrampr4_uv namelist,fdda 1 50 rh "obs_nudgezrampr4_uv" "Vert infl ramp-to-zero height for LML obs, regime 4, winds" "" rconfig real obs_nudgezfullr1_t namelist,fdda 1 50 rh "obs_nudgezfullr1_t" "Vert infl full weight height for LML obs, regime 1, temperature" "" rconfig real obs_nudgezrampr1_t namelist,fdda 1 50 rh "obs_nudgezrampr1_t" "Vert infl ramp-to-zero height for LML obs, regime 1, temperature" "" rconfig real obs_nudgezfullr2_t namelist,fdda 1 50 rh "obs_nudgezfullr2_t" "Vert infl full weight height for LML obs, regime 2, temperature" "" rconfig real obs_nudgezrampr2_t namelist,fdda 1 50 rh "obs_nudgezrampr2_t" "Vert infl ramp-to-zero height for LML obs, regime 2, temperature" "" -rconfig real obs_nudgezfullr4_t namelist,fdda 1 50 rh "obs_nudgezfullr4_t" "Vert infl full weight height for LML obs, regime 4, temperature" "" -rconfig real obs_nudgezrampr4_t namelist,fdda 1 -5000 rh "obs_nudgezrampr4_t" "Vert infl ramp-to-zero height for LML obs, regime 4, temperature" "" +rconfig real obs_nudgezfullr4_t namelist,fdda 1 -5000 rh "obs_nudgezfullr4_t" "Vert infl full weight height for LML obs, regime 4, temperature" "" +rconfig real obs_nudgezrampr4_t namelist,fdda 1 50 rh "obs_nudgezrampr4_t" "Vert infl ramp-to-zero height for LML obs, regime 4, temperature" "" rconfig real obs_nudgezfullr1_q namelist,fdda 1 50 rh "obs_nudgezfullr1_q" "Vert infl full weight height for LML obs, regime 1, moisture" "" rconfig real obs_nudgezrampr1_q namelist,fdda 1 50 rh "obs_nudgezrampr1_q" "Vert infl ramp-to-zero height for LML obs, regime 1, moisture" "" rconfig real obs_nudgezfullr2_q namelist,fdda 1 50 rh "obs_nudgezfullr2_q" "Vert infl full weight height for LML obs, regime 2, moisture" "" rconfig real obs_nudgezrampr2_q namelist,fdda 1 50 rh "obs_nudgezrampr2_q" "Vert infl ramp-to-zero height for LML obs, regime 2, moisture" "" -rconfig real obs_nudgezfullr4_q namelist,fdda 1 50 rh "obs_nudgezfullr4_q" "Vert infl full weight height for LML obs, regime 4, moisture" "" -rconfig real obs_nudgezrampr4_q namelist,fdda 1 -5000 rh "obs_nudgezrampr4_q" "Vert infl ramp-to-zero height for LML obs, regime 4, moisture" "" +rconfig real obs_nudgezfullr4_q namelist,fdda 1 -5000 rh "obs_nudgezfullr4_q" "Vert infl full weight height for LML obs, regime 4, moisture" "" +rconfig real obs_nudgezrampr4_q namelist,fdda 1 50 rh "obs_nudgezrampr4_q" "Vert infl ramp-to-zero height for LML obs, regime 4, moisture" "" rconfig real obs_nudgezfullmin namelist,fdda 1 50 rh "obs_nudgezfullmin" "Minimum depth through which vertical influence fcn remains 1.0" "m" rconfig real obs_nudgezrampmin namelist,fdda 1 50 rh "obs_nudgezrampmin" "Minimum depth through which vertical influence fcn decreases from 1.0 to 0.0" "m" rconfig real obs_nudgezmax namelist,fdda 1 3000 rh "obs_nudgezmax" "Maximum depth in which vertical influence function is nonzero" "m" @@ -2119,10 +2121,10 @@ package dfi_dfl dfi_opt==1 - state:dfi_u,df package dfi_ddfi dfi_opt==2 - state:dfi_u,dfi_v,dfi_w,dfi_ph,dfi_phb,dfi_ph0,dfi_php,dfi_t,dfi_p,dfi_ww,dfi_mu,dfi_tke,dfi_pb,dfi_al,dfi_alt,dfi_TSLB,dfi_SMOIS,dfi_SNOW,dfi_SNOWH,dfi_CANWAT,dfi_SMFR3D,dfi_KEEPFR3DFLAG,dfi_TSK,dfi_SOILT1,dfi_TSNAV,dfi_SNOWC,dfi_QVG,dfi_rh,dfi_tten_rad package dfi_tdfi dfi_opt==3 - state:dfi_u,dfi_v,dfi_w,dfi_ph,dfi_phb,dfi_ph0,dfi_php,dfi_t,dfi_p,dfi_ww,dfi_mu,dfi_tke,dfi_pb,dfi_al,dfi_alt,dfi_TSLB,dfi_SMOIS,dfi_SNOW,dfi_SNOWH,dfi_CANWAT,dfi_SMFR3D,dfi_KEEPFR3DFLAG,dfi_TSK,dfi_SOILT1,dfi_TSNAV,dfi_SNOWC,dfi_QVG,dfi_rh,dfi_tten_rad ifdef RUC_CLOUD -package realonly use_wps_input==1 - state:u_gc,v_gc,t_gc,rh_gc,ght_gc,p_gc,xlat_gc,xlong_gc,ht_gc,tsk_gc,tavgsfc,tmn_gc,pslv_gc,greenfrac,albedo12m,pd_gc,psfc_gc,intq_gc,pdhs,sh_gc,qv_gc,qr_gc,qc_gc,qs_gc,qi_gc,qg_gc,qni_gc +package realonly use_wps_input==1 - state:u_gc,v_gc,t_gc,rh_gc,ght_gc,p_gc,xlat_gc,xlong_gc,ht_gc,tsk_gc,tavgsfc,tmn_gc,pslv_gc,sct_dom_gc,scb_dom_gc,greenfrac,albedo12m,pd_gc,psfc_gc,intq_gc,pdhs,sh_gc,qv_gc,qr_gc,qc_gc,qs_gc,qi_gc,qg_gc,qni_gc endif ifndef RUC_CLOUD -package realonly use_wps_input==1 - state:u_gc,v_gc,t_gc,rh_gc,ght_gc,p_gc,xlat_gc,xlong_gc,ht_gc,tsk_gc,tavgsfc,tmn_gc,pslv_gc,greenfrac,albedo12m,pd_gc,psfc_gc,intq_gc,pdhs,sh_gc,qv_gc +package realonly use_wps_input==1 - state:u_gc,v_gc,t_gc,rh_gc,ght_gc,p_gc,xlat_gc,xlong_gc,ht_gc,tsk_gc,tavgsfc,tmn_gc,pslv_gc,sct_dom_gc,scb_dom_gc,greenfrac,albedo12m,pd_gc,psfc_gc,intq_gc,pdhs,sh_gc,qv_gc endif package varscheme wrfvar_mem_model==1 - state:ru,ru_m,ru_tend,u_save,rv,rv_m,rv_tend,v_save,ww,rw,ww_m,ph0,php,tp,t_save,tke,al,alt,alb,zx,zy,rdz,rdzw,obs_savwt,sm000007,sm007028,sm028100,sm100255,st000007,st007028,st028100,st100255,sm000010,sm010040,sm040100,sm100200,sm010200,soilm000,soilm005,soilm020,soilm040,soilm160,soilm300,sw000010,sw010040,sw040100,sw100200,sw010200,soilw000,soilw005,soilw020,soilw040,soilw160,soilw300,st000010,st010040,st040100,st100200,st010200,soilt000,soilt005,soilt020,soilt040,soilt160,soilt300,topostdv,toposlpx,toposlpy,slopecat,toposoil,soilcat,vegcat,tke_myj,EL_MYJ,EXCH_H,RTHCUTEN,RQVCUTEN,RQRCUTEN,RQCCUTEN,RQSCUTEN,RQICUTEN,W0AVG,xf_ens,pr_ens,cugd_tten,cugd_qvten,cugd_ttens,cugd_qvtens,cugd_qcten,RTHFTEN,RQVFTEN,RTHRATEN,RTHRATENLW,RTHRATENSW,CLDFRA,taucldi,taucldc,defor11,defor22,defor12,defor33,defor13,defor23,xkmv,xkmh,xkhv,xkhh,div,BN2 @@ -2632,6 +2634,7 @@ typedef fdob_type real latprt [ - 1 - typedef fdob_type real lonprt [ - 1 - - "lonprt" "obs longitude for diagnostic printout" typedef fdob_type real mlatprt [ - 1 - - "mlatprt" "model latitude at obs location" typedef fdob_type real mlonprt [ - 1 - - "mlonprt" "model longitude at obs location" +typedef fdob_type integer stnidprt {obsstid}{[} - 1 - - "stnidprt" "obs station id for diagnostic printout" typedef fdob_type real base_state k - 1 - - "base_state" "base-state height on half (mass) levels" "meters" state fdob_type fdob - - diff --git a/Registry/registry.dimspec b/Registry/registry.dimspec index 81baae7996..f9a8ac0026 100644 --- a/Registry/registry.dimspec +++ b/Registry/registry.dimspec @@ -25,6 +25,7 @@ dimspec obs - namelist=max_obs c max_obs dimspec h - namelist=nobs_err_flds c nobs_err_flds dimspec nndgvar - namelist=nobs_ndg_vars c nobs_ndg_vars dimspec [ - namelist=obs_prt_max c obs_prt_max +dimspec obsstid - constant=40 c obs station id names dimspec & 2 namelist=lagday z lagday endif diff --git a/dyn_em/module_initialize_real.F b/dyn_em/module_initialize_real.F index ef5adcf2de..25ebcc4489 100644 --- a/dyn_em/module_initialize_real.F +++ b/dyn_em/module_initialize_real.F @@ -133,6 +133,7 @@ SUBROUTINE init_domain_rk ( grid & LOGICAL , PARAMETER :: want_half_levels = .FALSE. CHARACTER (LEN=80) :: a_message + REAL :: max_mf !-- Carsel and Parrish [1988] REAL , DIMENSION(100) :: lqmi @@ -152,6 +153,22 @@ SUBROUTINE init_domain_rk ( grid & CALL model_to_grid_config_rec ( grid%id , model_config_rec , config_flags ) + ! Send out a quick message about the time steps based on the map scale factors. + + IF ( ( internal_time_loop .EQ. 1 ) .AND. ( grid%id .EQ. 1 ) .AND. ( .NOT. config_flags%map_proj .EQ. PROJ_CASSINI ) ) THEN + max_mf = grid%msft(its,jts) + DO j=jts,MIN(jde-1,jte) + DO i=its,MIN(ide-1,ite) + max_mf = MAX ( max_mf , grid%msft(i,j) ) + END DO + END DO +#if ( defined(DM_PARALLEL) && ! defined(STUBMPI) ) + max_mf = wrf_dm_max_real ( max_mf ) +#endif + WRITE ( a_message , FMT='(A,F5.2,A)' ) 'Max map factor in domain 1 = ',max_mf,'. Scale the dt in the model accordingly.' + CALL wrf_message ( a_message ) + END IF + ! Check to see if the boundary conditions are set properly in the namelist file. ! This checks for sufficiency and redundancy. @@ -442,10 +459,67 @@ SUBROUTINE init_domain_rk ( grid & num_metgrid_levels = grid%num_metgrid_levels + ! Check for and semi-fix missing surface fields. + + IF ( grid%p_gc(its,num_metgrid_levels,jts) .LT. grid%p_gc(its,2,jts) ) THEN + k = 2 + ELSE + k = num_metgrid_levels + END IF + + IF ( grid%t_gc(its,1,jts) .EQ. -1.E30 ) THEN + DO j = jts, MIN(jte,jde-1) + DO i = its, MIN(ite,ide-1) + grid%t_gc(i,1,j) = grid%t_gc(i,k,j) + END DO + END DO + config_flags%use_surface = .FALSE. + grid%use_surface = .FALSE. + WRITE ( a_message , * ) 'Missing surface temp, replaced with closest level, use_surface set to false.' + CALL wrf_message ( a_message ) + END IF + + IF ( grid%rh_gc(its,1,jts) .EQ. -1.E30 ) THEN + DO j = jts, MIN(jte,jde-1) + DO i = its, MIN(ite,ide-1) + grid%rh_gc(i,1,j) = grid%rh_gc(i,k,j) + END DO + END DO + config_flags%use_surface = .FALSE. + grid%use_surface = .FALSE. + WRITE ( a_message , * ) 'Missing surface RH, replaced with closest level, use_surface set to false.' + CALL wrf_message ( a_message ) + END IF + + IF ( grid%u_gc(its,1,jts) .EQ. -1.E30 ) THEN + DO j = jts, MIN(jte,jde-1) + DO i = its, ite + grid%u_gc(i,1,j) = grid%u_gc(i,k,j) + END DO + END DO + config_flags%use_surface = .FALSE. + grid%use_surface = .FALSE. + WRITE ( a_message , * ) 'Missing surface u wind, replaced with closest level, use_surface set to false.' + CALL wrf_message ( a_message ) + END IF + + IF ( grid%v_gc(its,1,jts) .EQ. -1.E30 ) THEN + DO j = jts, jte + DO i = its, MIN(ite,ide-1) + grid%v_gc(i,1,j) = grid%v_gc(i,k,j) + END DO + END DO + config_flags%use_surface = .FALSE. + grid%use_surface = .FALSE. + WRITE ( a_message , * ) 'Missing surface v wind, replaced with closest level, use_surface set to false.' + CALL wrf_message ( a_message ) + END IF + + ! Compute the mixing ratio from the input relative humidity. IF ( ( flag_qv .NE. 1 ) .AND. ( flag_sh .NE. 1 ) ) THEN - IF ( grid%p_gc(i,num_metgrid_levels,j) .LT. grid%p_gc(i,2,j) ) THEN + IF ( grid%p_gc(its,num_metgrid_levels,jts) .LT. grid%p_gc(its,2,jts) ) THEN k = 2 ELSE k = num_metgrid_levels @@ -457,17 +531,8 @@ SUBROUTINE init_domain_rk ( grid & ims , ime , jms , jme , 1 , num_metgrid_levels , & its , ite , jts , jte , 1 , num_metgrid_levels ) - ! Some data sets do not provide a surface RH field. - - IF ( ABS(grid%rh_gc(its,kts,jts)) .LT. 1.e-5 ) THEN - DO j = jts, MIN(jte,jde-1) - DO i = its, MIN(ite,ide-1) - grid%rh_gc(i,1,j) = grid%rh_gc(i,k,j) - END DO - END DO - END IF ELSE IF ( flag_sh .EQ. 1 ) THEN - IF ( grid%p_gc(i,num_metgrid_levels,j) .LT. grid%p_gc(i,2,j) ) THEN + IF ( grid%p_gc(its,num_metgrid_levels,jts) .LT. grid%p_gc(its,2,jts) ) THEN k = 2 ELSE k = num_metgrid_levels @@ -807,7 +872,10 @@ SUBROUTINE init_domain_rk ( grid & t_extrap_type = grid%t_extrap_type extrap_type = grid%extrap_type - CALL vert_interp ( grid%qv_gc , grid%pd_gc , moist(:,:,:,P_QV) , grid%pb , & + ! Interpolate RH, diagnose Qv later when have temp and pressure. Temporarily + ! store this in the u_1 space, for later diagnosis into Qv and stored into moist. + + CALL vert_interp ( grid%rh_gc , grid%pd_gc , grid%u_1 , grid%pb , & num_metgrid_levels , 'Q' , & interp_type , lagrange_order , extrap_type , & lowest_lev_from_sfc , use_levels_below_ground , use_surface , & @@ -824,6 +892,24 @@ SUBROUTINE init_domain_rk ( grid & ids , ide , jds , jde , kds , kde , & ims , ime , jms , jme , kms , kme , & its , ite , jts , jte , kts , kte ) + + ! Do not have full pressure on eta levels, get a first guess at Qv by using + ! dry pressure. The use of u_1 (rh) and v_1 (temperature) is temporary. + ! We fix the approximation to Qv after the total pressure is available on + ! eta surfaces. + + grid%v_1 = grid%t_2 + CALL theta_to_t ( grid%v_1 , grid%pb , p00 , & + ids , ide , jds , jde , kds , kde , & + ims , ime , jms , jme , kms , kme , & + its , ite , jts , jte , kts , kte ) + + CALL rh_to_mxrat (grid%u_1, grid%v_1, grid%pb, moist(:,:,:,P_QV) , & + config_flags%rh2qv_wrt_liquid , & + ids , ide , jds , jde , kds , kde , & + ims , ime , jms , jme , kms , kme , & + its , ite , jts , jte , kts , kte ) + #ifdef RUC_CLOUD ! Add -DRUC_CLOUD to ARCHFLAGS in configure.wrf file to activate the following code @@ -1075,29 +1161,9 @@ SUBROUTINE init_domain_rk ( grid & END SELECT interpolate_soil_tmw - ! Adjustments for the seaice field PRIOR to the grid%tslb computations. This is - ! is for the 5-layer scheme. - - num_veg_cat = SIZE ( grid%landusef , DIM=2 ) - num_soil_top_cat = SIZE ( grid%soilctop , DIM=2 ) - num_soil_bot_cat = SIZE ( grid%soilcbot , DIM=2 ) - CALL nl_get_seaice_threshold ( grid%id , grid%seaice_threshold ) - CALL nl_get_isice ( grid%id , grid%isice ) - CALL nl_get_iswater ( grid%id , grid%iswater ) - CALL adjust_for_seaice_pre ( grid%xice , grid%landmask , grid%tsk , grid%ivgtyp , grid%vegcat , grid%lu_index , & - grid%xland , grid%landusef , grid%isltyp , grid%soilcat , grid%soilctop , & - grid%soilcbot , grid%tmn , & - grid%seaice_threshold , & - config_flags%fractional_seaice, & - num_veg_cat , num_soil_top_cat , num_soil_bot_cat , & - grid%iswater , grid%isice , & - model_config_rec%sf_surface_physics(grid%id) , & - ids , ide , jds , jde , kds , kde , & - ims , ime , jms , jme , kms , kme , & - its , ite , jts , jte , kts , kte ) - ! surface_input_source=1 => use data from static file (fractional category as input) ! surface_input_source=2 => use data from grib file (dominant category as input) + ! surface_input_source=3 => use dominant data from static file (dominant category as input) IF ( config_flags%surface_input_source .EQ. 1 ) THEN grid%vegcat (its,jts) = 0 @@ -1131,7 +1197,7 @@ SUBROUTINE init_domain_rk ( grid & END DO END DO - ELSE + ELSE IF ( config_flags%surface_input_source .EQ. 2 ) THEN ! Do we have dominant soil and veg data from the input already? @@ -1150,8 +1216,56 @@ SUBROUTINE init_domain_rk ( grid & END DO END IF + ELSE IF ( config_flags%surface_input_source .EQ. 3 ) THEN + + ! Do we have dominant soil and veg data from the static input already? + + IF ( grid%sct_dom_gc(its,jts) .GT. 0.5 ) THEN + DO j = jts, MIN(jde-1,jte) + DO i = its, MIN(ide-1,ite) + grid%isltyp(i,j) = NINT( grid%sct_dom_gc(i,j) ) + grid%soilcat(i,j) = grid%isltyp(i,j) + END DO + END DO + ELSE + WRITE ( a_message , * ) 'You have set surface_input_source = 3, but your geogrid data does not have valid dominant soil data.' + CALL wrf_error_fatal ( a_message ) + END IF + IF ( grid%lu_index(its,jts) .GT. 0.5 ) THEN + DO j = jts, MIN(jde-1,jte) + DO i = its, MIN(ide-1,ite) + grid%ivgtyp(i,j) = NINT( grid%lu_index(i,j) ) + grid%vegcat(i,j) = grid%ivgtyp(i,j) + END DO + END DO + ELSE + WRITE ( a_message , * ) 'You have set surface_input_source = 3, but your geogrid data does not have valid dominant land use data.' + CALL wrf_error_fatal ( a_message ) + END IF + END IF + ! Adjustments for the seaice field PRIOR to the grid%tslb computations. This is + ! is for the 5-layer scheme. + + num_veg_cat = SIZE ( grid%landusef , DIM=2 ) + num_soil_top_cat = SIZE ( grid%soilctop , DIM=2 ) + num_soil_bot_cat = SIZE ( grid%soilcbot , DIM=2 ) + CALL nl_get_seaice_threshold ( grid%id , grid%seaice_threshold ) + CALL nl_get_isice ( grid%id , grid%isice ) + CALL nl_get_iswater ( grid%id , grid%iswater ) + CALL adjust_for_seaice_pre ( grid%xice , grid%landmask , grid%tsk , grid%ivgtyp , grid%vegcat , grid%lu_index , & + grid%xland , grid%landusef , grid%isltyp , grid%soilcat , grid%soilctop , & + grid%soilcbot , grid%tmn , & + grid%seaice_threshold , & + config_flags%fractional_seaice, & + num_veg_cat , num_soil_top_cat , num_soil_bot_cat , & + grid%iswater , grid%isice , & + model_config_rec%sf_surface_physics(grid%id) , & + ids , ide , jds , jde , kds , kde , & + ims , ime , jms , jme , kms , kme , & + its , ite , jts , jte , kts , kte ) + ! Land use assignment. DO j = jts, MIN(jde-1,jte) @@ -1803,6 +1917,24 @@ SUBROUTINE init_domain_rk ( grid & END DO END DO + + ! Recompute Qv with full pressure on eta levels. We use the temporary + ! space of v_1 for total theta, which gets diagnosed into temperature. + ! The u_1 array is RH on eta levels from the initial interpolation. The + ! previous value of moist was computed with dry pressure, not total + ! pressure. + + grid%v_1 = grid%t_2 + 300 + CALL theta_to_t ( grid%v_1 , grid%pb + grid%p , p00 , & + ids , ide , jds , jde , kds , kde , & + ims , ime , jms , jme , kms , kme , & + its , ite , jts , jte , kts , kte ) + + CALL rh_to_mxrat (grid%u_1, grid%v_1, grid%pb + grid%p, moist(:,:,:,P_QV) , & + config_flags%rh2qv_wrt_liquid , & + ids , ide , jds , jde , kds , kde , & + ims , ime , jms , jme , kms , kme , & + its , ite , jts , jte , kts , kte ) ! If this is data from the SI, then we probably do not have the original ! surface data laying around. Note that these are all the lowest levels @@ -2734,7 +2866,7 @@ SUBROUTINE vert_interp ( fo , po , fnew , pnu , & ! This is easy, the surface is the lowest level, just stick them in, in this order. OK, ! there are a couple of subtleties. We have to check for that special interpolation that ! skips some input levels so that the surface is used for the lowest few eta levels. Also, - ! we must macke sure that we still do not have levels that are "too close" together. + ! we must make sure that we still do not have levels that are "too close" together. ELSE @@ -2775,7 +2907,8 @@ SUBROUTINE vert_interp ( fo , po , fnew , pnu , & ! be directly impacted with the surface level in interpolation. DO ko = knext , generic - IF ( ordered_porig(count-1) - porig(i,ko,j) .LT. zap_close_levels ) THEN + IF ( ( ordered_porig(count-1) - porig(i,ko,j) .LT. zap_close_levels ) .AND. & + ( ko .LT. generic ) ) THEN zap = zap + 1 zap_above = zap_above + 1 CYCLE @@ -3706,7 +3839,7 @@ SUBROUTINE t_to_theta ( t , p , p00 , & ims , ime , jms , jme , kms , kme , & its , ite , jts , jte , kts , kte ) - ! Compute dry, hydrostatic surface pressure. + ! Compute potential temperature from temperature and pressure. IMPLICIT NONE @@ -3734,6 +3867,42 @@ SUBROUTINE t_to_theta ( t , p , p00 , & END SUBROUTINE t_to_theta + +!--------------------------------------------------------------------- + + SUBROUTINE theta_to_t ( t , p , p00 , & + ids , ide , jds , jde , kds , kde , & + ims , ime , jms , jme , kms , kme , & + its , ite , jts , jte , kts , kte ) + + ! Compute temperature from potential temp and pressure. + + IMPLICIT NONE + + INTEGER , INTENT(IN) :: ids , ide , jds , jde , kds , kde , & + ims , ime , jms , jme , kms , kme , & + its , ite , jts , jte , kts , kte + + REAL , INTENT(IN) :: p00 + REAL , DIMENSION(ims:ime,kms:kme,jms:jme) , INTENT(IN) :: p + REAL , DIMENSION(ims:ime,kms:kme,jms:jme) , INTENT(INOUT) :: t + + ! Local vars + + INTEGER :: i , j , k + + REAL , PARAMETER :: Rd = r_d + + DO j = jts , MIN ( jde-1 , jte ) + DO k = kts , kte + DO i = its , MIN (ide-1 , ite ) + t(i,k,j) = t(i,k,j) / ( ( p00 / p(i,k,j) ) ** (Rd / Cp) ) + END DO + END DO + END DO + + END SUBROUTINE theta_to_t + !--------------------------------------------------------------------- SUBROUTINE integ_moist ( q_in , p_in , pd_out , t_in , ght_in , intq , & @@ -3969,6 +4138,11 @@ SUBROUTINE rh_to_mxrat (rh, t, p, q , wrt_liquid , & DO j = jts , MIN ( jde-1 , jte ) DO k = kts , kte DO i = its , MIN (ide-1 , ite ) + IF ( p(i,k,j) .LT. 10000 ) THEN + IF ( rh(i,k,j) .GT. .1 ) THEN + rh(i,k,j) = 1.E-5 + END IF + END IF rh(i,k,j) = MIN ( MAX ( rh(i,k,j) , 0. ) , 100. ) END DO END DO diff --git a/dyn_em/start_em.F b/dyn_em/start_em.F index 77a3fabf3e..bd69e77a46 100644 --- a/dyn_em/start_em.F +++ b/dyn_em/start_em.F @@ -458,6 +458,7 @@ SUBROUTINE start_domain_em ( grid, allowed_to_read & qvf2 = 1./(1.+qvf1) qvf1 = qvf1*qvf2 grid%p(i,k,j) = - 0.5*(grid%mu_1(i,j)+qvf1*grid%mub(i,j))/grid%rdnw(k)/qvf2 + grid%p_hyd(i,k,j) = grid%p(i,k,j) + grid%pb(i,k,j) qvf = 1. + rvovrd*moist(i,k,j,P_QV) grid%alt(i,k,j) = (r_d/p1000mb)*(grid%t_1(i,k,j)+t0)*qvf*(((grid%p(i,k,j)+grid%pb(i,k,j))/p1000mb)**cvpm) grid%al(i,k,j) = grid%alt(i,k,j) - grid%alb(i,k,j) @@ -471,6 +472,7 @@ SUBROUTINE start_domain_em ( grid, allowed_to_read & qvf2 = 1./(1.+qvf1) qvf1 = qvf1*qvf2 grid%p(i,k,j) = grid%p(i,k+1,j) - (grid%mu_1(i,j) + qvf1*grid%mub(i,j))/qvf2/grid%rdn(k+1) + grid%p_hyd(i,k,j) = grid%p(i,k,j) + grid%pb(i,k,j) qvf = 1. + rvovrd*moist(i,k,j,P_QV) grid%alt(i,k,j) = (r_d/p1000mb)*(grid%t_1(i,k,j)+t0)*qvf* & (((grid%p(i,k,j)+grid%pb(i,k,j))/p1000mb)**cvpm) diff --git a/phys/module_fdda_psufddagd.F b/phys/module_fdda_psufddagd.F index c051e15afe..a5b1cc43b9 100644 --- a/phys/module_fdda_psufddagd.F +++ b/phys/module_fdda_psufddagd.F @@ -946,9 +946,9 @@ SUBROUTINE sfddagd(itimestep,dx,dt,xtime, & ! Smoother applies one point outside the tile, but one point in from boundaries CALL smther(blw_old, its-2,itf+1, jts-2,jtf+1, 1, & - MAX(its-2,ids+1), MIN(ite+1,ide-2), MAX(jts-2,jds+1), MIN(jte+1,jde-2)) + MAX(its-1,ids+1), MIN(ite ,ide-2), MAX(jts-1,jds+1), MIN(jte ,jde-2)) CALL smther(blw_new, its-2,itf+1, jts-2,jtf+1, 1, & - MAX(its-2,ids+1), MIN(ite+1,ide-2), MAX(jts-2,jds+1), MIN(jte+1,jde-2)) + MAX(its-1,ids+1), MIN(ite ,ide-2), MAX(jts-1,jds+1), MIN(jte ,jde-2)) WHERE ( blw_old > 1.0) blw_old = 1.0 diff --git a/phys/module_fddaobs_driver.F b/phys/module_fddaobs_driver.F index 5bb8f80e20..2afa146bad 100644 --- a/phys/module_fddaobs_driver.F +++ b/phys/module_fddaobs_driver.F @@ -58,7 +58,8 @@ SUBROUTINE fddaobs_driver( inest, domid, parid, restart, & ub, vb, tb, qvb, pbase, ptop, pp, phb, ph, & uratx, vratx, tratx, ru_tendf, rv_tendf, & moist_tend, savwt, & - regime, pblh, z_at_w, z, & + regime, pblh, z_at_w, & + z, & ids,ide, jds,jde, kds,kde, & ! domain dims ims,ime, jms,jme, kms,kme, & ! memory dims its,ite, jts,jte, kts,kte ) ! tile dims @@ -149,8 +150,8 @@ SUBROUTINE fddaobs_driver( inest, domid, parid, restart, & REAL, INTENT(INOUT) :: savwt( nobs_ndg_vars, ims:ime, kms:kme, jms:jme ) REAL, INTENT(INOUT) :: regime( ims:ime, jms:jme ) REAL, INTENT(IN) :: pblh( ims:ime, jms:jme ) - REAL, INTENT(IN) :: z_at_w( ims:ime, kms:kme, jms:jme ) - REAL, INTENT(IN) :: z( ims:ime, kms:kme, jms:jme ) ! Model ht above sea-level + REAL, INTENT(IN) :: z_at_w( ims:ime, kms:kme, jms:jme ) ! Model ht(m) asl, f-levs + REAL, INTENT(IN) :: z( ims:ime, kms:kme, jms:jme ) ! Model ht(m) asl, h-levs #if ( EM_CORE == 1 ) TYPE(fdob_type), intent(inout) :: fdob @@ -235,7 +236,7 @@ SUBROUTINE fddaobs_driver( inest, domid, parid, restart, & .AND. config_flags%bl_pbl_physics /= 99 ) THEN DO j = jts, jte DO i = its, ite - IF( pblh(i,j) > z_at_w(i,1,j)-ht(i,j) ) THEN + IF( pblh(i,j) > z_at_w(i,2,j)-ht(i,j) ) THEN regime(i,j) = 4.0 ELSE regime(i,j) = 1.0 @@ -279,7 +280,7 @@ SUBROUTINE fddaobs_driver( inest, domid, parid, restart, & IF( MOD(ktau,infr).EQ.0 .OR. idarst.EQ.1) THEN CALL errob(inest, ub, vb, tb, t0, qvb, pbase, pp, rcp, & - z_at_w, & + z, & uratx, vratx, tratx, kpbl, & nobs_ndg_vars, nobs_err_flds, max_obs, maxdom, & fdob%levidn, parid, fdob%nstat, fdob%nstaw, & @@ -288,7 +289,8 @@ SUBROUTINE fddaobs_driver( inest, domid, parid, restart, & varobs, errf, ktau, xtime, & parent_grid_ratio, npfi, & obs_prt_max, obs_prt_freq, iprt_errob, & - fdob%obsprt, fdob%latprt, fdob%lonprt, & + fdob%obsprt, fdob%stnidprt, & + fdob%latprt, fdob%lonprt, & fdob%mlatprt, fdob%mlonprt, & ids,ide, jds,jde, kds,kde, & ims,ime, jms,jme, kms,kme, & diff --git a/phys/module_fddaobs_rtfdda.F b/phys/module_fddaobs_rtfdda.F index 70a6d056d6..a559e10901 100644 --- a/phys/module_fddaobs_rtfdda.F +++ b/phys/module_fddaobs_rtfdda.F @@ -45,6 +45,7 @@ SUBROUTINE fddaobs_init(nudge_opt, maxdom, inest, parid, & no_pbl_nudge_t, & no_pbl_nudge_q, & sfcfact, sfcfacr, dpsmx, & + nudge_wind, nudge_temp, nudge_mois, & nudgezfullr1_uv, nudgezrampr1_uv, & nudgezfullr2_uv, nudgezrampr2_uv, & nudgezfullr4_uv, nudgezrampr4_uv, & @@ -101,6 +102,9 @@ SUBROUTINE fddaobs_init(nudge_opt, maxdom, inest, parid, & REAL, intent(in) :: sfcfact ! scale factor applied to time window for surface obs REAL, intent(in) :: sfcfacr ! scale fac applied to horiz rad of infl for sfc obs REAL, intent(in) :: dpsmx ! max press change allowed within hor rad of infl + INTEGER , INTENT(IN) :: nudge_wind(maxdom) ! wind-nudging flag + INTEGER , INTENT(IN) :: nudge_temp(maxdom) ! temperature-nudging flag + INTEGER , INTENT(IN) :: nudge_mois(maxdom) ! moisture-nudging flag REAL, INTENT(IN) :: nudgezfullr1_uv ! vert infl fcn, regime=1 full-wt hght, winds REAL, INTENT(IN) :: nudgezrampr1_uv ! vert infl fcn, regime=1 ramp down hght, winds REAL, INTENT(IN) :: nudgezfullr2_uv ! vert infl fcn, regime=2 full-wt hght, winds @@ -164,7 +168,7 @@ SUBROUTINE fddaobs_init(nudge_opt, maxdom, inest, parid, & if (.not. nudge_flag) return call wrf_message("") - write(msg,'(a,i2)') ' OBSERVATION NUDGING IS ACTIVATED FOR MESH ',inest + write(msg,fmt='(a,i2)') ' OBSERVATION NUDGING IS ACTIVATED FOR MESH ',inest call wrf_message(msg) ktau = itimestep @@ -198,7 +202,7 @@ SUBROUTINE fddaobs_init(nudge_opt, maxdom, inest, parid, & endif if(iprt) then call wrf_message("") - write(msg,'(a,i3,a)') & + write(msg,fmt='(a,i3,a)') & ' *** DYNAMIC-INITIALIZATION OPTION FOR INEST = ', inest, ' ***' call wrf_message(msg) write(msg,*) ' FDAEND,DATEND,DTRAMP: ',fdaend(inest),fdob%datend,dtramp @@ -216,9 +220,9 @@ SUBROUTINE fddaobs_init(nudge_opt, maxdom, inest, parid, & ! Set time window. fdob%window = twindo call wrf_message("") - write(msg,'(a,i3)') '*** TIME WINDOW SETTINGS FOR NEST ',inest + write(msg,fmt='(a,i3)') '*** TIME WINDOW SETTINGS FOR NEST ',inest call wrf_message(msg) - write(msg,'(a,f6.3,2(a,f5.3))') ' TWINDO (hrs) = ',twindo, & + write(msg,fmt='(a,f6.3,2(a,f5.3))') ' TWINDO (hrs) = ',twindo, & ' SFCFACT = ',sfcfact,' SFCFACR = ',sfcfacr call wrf_message(msg) call wrf_message("") @@ -239,9 +243,9 @@ SUBROUTINE fddaobs_init(nudge_opt, maxdom, inest, parid, & fdob%window = twindo_cg if(iprt) then call wrf_message("") - write(msg,'(a,i2)') 'WARNING: TWINDO=0. for nest ',inest + write(msg,fmt='(a,i2)') 'WARNING: TWINDO=0. for nest ',inest call wrf_message(msg) - write(msg,'(a,f12.5,a)') 'Default to coarse-grid value of ', twindo_cg,' hrs' + write(msg,fmt='(a,f12.5,a)') 'Default to coarse-grid value of ', twindo_cg,' hrs' call wrf_message(msg) call wrf_message("") endif @@ -267,7 +271,7 @@ SUBROUTINE fddaobs_init(nudge_opt, maxdom, inest, parid, & CALL get_base_state_height_column( p_top, p00, t00, tlp, g, r_d, znu, & fdob%base_state, kts, kte, kds,kde, kms,kme ) -! Initialize flags for nudging within PBL. +! Initialize flags for nudging within PBL. fdob%nudge_uv_pbl = .true. fdob%nudge_t_pbl = .true. fdob%nudge_q_pbl = .true. @@ -336,7 +340,7 @@ SUBROUTINE fddaobs_init(nudge_opt, maxdom, inest, parid, & if(nudgezmax.lt.nudgezfullmin+nudgezrampmin) then write(msg,*) 'STOP! INCONSISTENT OBS NAMELIST INPUTS.' call wrf_message(msg) - write(msg,'(3(a,f12.3))') 'obs_nudgezmax = ',nudgezmax, & + write(msg,fmt='(3(a,f12.3))') 'obs_nudgezmax = ',nudgezmax, & ' obs_nudgezfullmin = ',nudgezfullmin, & ' obs_nudgezrampmin = ',nudgezrampmin call wrf_message(msg) @@ -359,40 +363,56 @@ SUBROUTINE fddaobs_init(nudge_opt, maxdom, inest, parid, & endif endif +! Print vertical weight info only if wind, temperature, or moisture nudging is requested. + if( (nudge_wind(inest).eq.1) .or. (nudge_temp(inest).eq.1) & + .or. (nudge_mois(inest).eq.1) ) then call wrf_message("") - call wrf_message("*** SETUP DESCRIPTION FOR SURFACE OBS NUDGING:") + write(msg,fmt='(a,i2,a)') ' *** SETUP DESCRIPTION FOR SURFACE OBS NUDGING ON MESH ',inest,' :' + call wrf_message(msg) + call wrf_message("") - write(msg,'(a,i5,a)') ' NUDGEZMAX: The maximum height at which nudging will be'// & + write(msg,fmt='(a,i5,a)') ' NUDGEZMAX: The maximum height at which nudging will be'// & ' applied from surface obs is ', nint(nudgezmax),' m AGL.' call wrf_message(msg) call wrf_message("") - write(msg,'(a,i3,a)') ' NUDGEZFULLMIN: The minimum height of full nudging weight'// & + write(msg,fmt='(a,i3,a)') ' NUDGEZFULLMIN: The minimum height of full nudging weight'// & ' for surface obs is ', nint(fdob%vif_fullmin),' m.' call wrf_message(msg) if(nudgezfullmin.lt.fdob%vif_fullmin) then - write(msg,'(a,i3,a)') ' ***WARNING***: NUDGEZFULLMIN has been increased from'// & + write(msg,fmt='(a,i3,a)') ' ***WARNING***: NUDGEZFULLMIN has been increased from'// & ' the user-input value of ',nint(nudgezfullmin),' m.' call wrf_message(msg) - write(msg,'(a,i3,a)') ' to ensure that at least the bottom model level is'// & + write(msg,fmt='(a,i3,a)') ' to ensure that at least the bottom model level is'// & ' included in full nudging.' call wrf_message(msg) endif call wrf_message("") - write(msg,'(a,i3,a)') ' NUDGEZRAMPMIN: The minimum height to ramp from full to no'// & + write(msg,fmt='(a,i3,a)') ' NUDGEZRAMPMIN: The minimum height to ramp from full to no'// & ' nudging for surface obs is ', nint(nudgezrampmin),' m.' call wrf_message(msg) call wrf_message("") + endif !endif either wind, temperature, or moisture nudging is requested ! Print vif settings - call print_vif_var('wind', fdob%vif_uv, nudgezfullmin, nudgezrampmin) - call wrf_message("") - call print_vif_var('temp', fdob%vif_t, nudgezfullmin, nudgezrampmin) - call wrf_message("") - call print_vif_var('mois', fdob%vif_q, nudgezfullmin, nudgezrampmin) + if(nudge_wind(inest) .eq. 1) then + call print_vif_var('wind', fdob%vif_uv, nudgezfullmin, nudgezrampmin) + call wrf_message("") + endif + if(nudge_temp(inest) .eq. 1) then + call print_vif_var('temp', fdob%vif_t, nudgezfullmin, nudgezrampmin) + call wrf_message("") + endif + if(nudge_mois(inest) .eq. 1) then + call print_vif_var('mois', fdob%vif_q, nudgezfullmin, nudgezrampmin) + call wrf_message("") + endif + if( (nudge_wind(inest).eq.1) .or. (nudge_temp(inest).eq.1) & + .or. (nudge_mois(inest).eq.1) ) then + write(msg,fmt='(a,i2)') ' *** END SETUP DESCRIPTION FOR SURFACE OBS NUDGING ON MESH ',inest + call wrf_message(msg) call wrf_message("") - call wrf_message("*** END SETUP DESCRIPTION FOR SURFACE OBS NUDGING") - call wrf_message("") + endif ! Set parameters. fdob%pfree = 50.0 @@ -454,7 +474,7 @@ END SUBROUTINE fddaobs_init #if ( EM_CORE == 1 ) !----------------------------------------------------------------------- SUBROUTINE errob(inest, ub, vb, tb, t0, qvb, pbase, pp, rovcp, & - z_at_w, & + z, & uratx, vratx, tratx, kpbl, & nndgv, nerrf, niobf, maxdom, & levidn, parid, nstat, nstaw, & @@ -463,7 +483,7 @@ SUBROUTINE errob(inest, ub, vb, tb, t0, qvb, pbase, pp, rovcp, & varobs, errf, ktau, xtime, & iratio, npfi, & prt_max, prt_freq, iprt, & - obs_prt, lat_prt, lon_prt, & + obs_prt, stnid_prt, lat_prt, lon_prt, & mlat_prt, mlon_prt, & ids,ide, jds,jde, kds,kde, & ims,ime, jms,jme, kms,kme, & @@ -528,11 +548,12 @@ SUBROUTINE errob(inest, ub, vb, tb, t0, qvb, pbase, pp, rovcp, & INTEGER, INTENT(IN) :: prt_max ! Max number of obs to print. INTEGER, INTENT(IN) :: prt_freq ! Frequency of obs to print. LOGICAL, INTENT(IN) :: iprt ! Print flag - INTEGER, INTENT(INOUT) :: obs_prt(prt_max) ! Print obs indices - REAL, INTENT(INOUT) :: lat_prt(prt_max) ! Print obs latitude - REAL, INTENT(INOUT) :: lon_prt(prt_max) ! Print obs longitude - REAL, INTENT(INOUT) :: mlat_prt(prt_max) ! Print model lat at obs loc - REAL, INTENT(INOUT) :: mlon_prt(prt_max) ! Print model lon at obs loc + INTEGER, INTENT(IN) :: obs_prt(prt_max) ! Print obs indices + INTEGER, INTENT(IN) :: stnid_prt(40,prt_max) ! Print obs station ids + REAL, INTENT(IN) :: lat_prt(prt_max) ! Print obs latitude + REAL, INTENT(IN) :: lon_prt(prt_max) ! Print obs longitude + REAL, INTENT(IN) :: mlat_prt(prt_max) ! Print model lat at obs loc + REAL, INTENT(IN) :: mlon_prt(prt_max) ! Print model lon at obs loc INTEGER, INTENT(IN) :: nstat ! # stations held for use INTEGER, INTENT(IN) :: nstaw ! # stations in current window INTEGER, intent(in) :: iswind @@ -551,7 +572,7 @@ SUBROUTINE errob(inest, ub, vb, tb, t0, qvb, pbase, pp, rovcp, & REAL, INTENT(IN) :: pbase( ims:ime, kms:kme, jms:jme ) REAL, INTENT(IN) :: pp( ims:ime, kms:kme, jms:jme ) ! Press. perturbation (Pa) REAL, INTENT(IN) :: rovcp - REAL, INTENT(IN) :: z_at_w( ims:ime, kms:kme, jms:jme ) + REAL, INTENT(IN) :: z( ims:ime, kms:kme, jms:jme ) ! Ht above sl on half-levels REAL, INTENT(IN) :: uratx( ims:ime, jms:jme ) ! U to U10 ratio on mass points. REAL, INTENT(IN) :: vratx( ims:ime, jms:jme ) ! V to V10 ratio on mass points. REAL, INTENT(IN) :: tratx( ims:ime, jms:jme ) ! T to TH2 ratio on mass points. @@ -630,7 +651,7 @@ SUBROUTINE errob(inest, ub, vb, tb, t0, qvb, pbase, pp, rovcp, & ! ITYP=1 FOR U-POINTS, ITYP=2 for V-POINTS, and ITYP=3 FOR MASS POINTS if (iprt) then - write(msg,'(a,i5,a,i2,a,i5,a)') '++++++CALL ERROB AT KTAU = ', & + write(msg,fmt='(a,i5,a,i2,a,i5,a)') '++++++CALL ERROB AT KTAU = ', & KTAU,' AND INEST = ',INEST,': NSTA = ',NSTAW,' ++++++' call wrf_message(msg) endif @@ -737,7 +758,7 @@ SUBROUTINE errob(inest, ub, vb, tb, t0, qvb, pbase, pp, rovcp, & if(pob .eq.-888888.) then hob = varobs(6,n) if(hob .gt. -800000. ) then - pob = ht_to_p( hob, ppbo, pbbo, z_at_w, iob_ms, job_ms, & + pob = ht_to_p( hob, ppbo, pbbo, z, iob_ms, job_ms, & dxob_ms, dyob_ms, k_start, k_end, kds,kde, & ims,ime, jms,jme, kms,kme ) endif @@ -845,7 +866,7 @@ SUBROUTINE errob(inest, ub, vb, tb, t0, qvb, pbase, pp, rovcp, & if(pob .eq.-888888.) then hob = varobs(6,n) if(hob .gt. -800000. ) then - pob = ht_to_p( hob, ppbo, pbbo, z_at_w, iob_ms, job_ms, & + pob = ht_to_p( hob, ppbo, pbbo, z, iob_ms, job_ms, & dxob_ms, dyob_ms, k_start, k_end, kds,kde, & ims,ime, jms,jme, kms,kme ) endif @@ -884,14 +905,6 @@ SUBROUTINE errob(inest, ub, vb, tb, t0, qvb, pbase, pp, rovcp, & ENDIF ! end if(inest.eq.1) - -! Print obs information. - if(ityp.eq.3) then !mass-point case - CALL print_obs_info(iprt,inest,niobf,rio,rjo,rko, & - prt_max,prt_freq,obs_prt,lat_prt,lon_prt, & - mlat_prt,mlon_prt,timeob,xtime) - endif - ! INITIALIZE THE ARRAY OF DIFFERENCES BETWEEN THE OBSERVATIONS ! AND THE LOCAL FORECAST VALUES TO ZERO. FOR THE FINE MESH ! ONLY, SET THE DIFFERENCE TO A LARGE DUMMY VALUE IF THE @@ -1281,8 +1294,23 @@ SUBROUTINE errob(inest, ub, vb, tb, t0, qvb, pbase, pp, rovcp, & ! Gather the errf values calculated by the processors with the obs. CALL get_full_obs_vector(nsta, nerrf, niobf, mp_local_uobmask, & mp_local_vobmask, mp_local_cobmask, errf) + +! 02252010: Go ahead and assign rko for "obs-off" processors here, to +! fix the problem where duplicate obs can be dropped from +! the "obs-on" processor, but not from the others, due to +! rko being -99 on the "obs-off" processors. + do n=1,nsta + rko(n) = errf(9,n) + enddo +! 02252010: End bugfix. #endif +! Print obs information. + CALL print_obs_info(iprt,inest,niobf,rio,rjo,rko, & + prt_max,prt_freq,obs_prt,stnid_prt, & + lat_prt,lon_prt,mlat_prt,mlon_prt, & + timeob,xtime) + ! DIFFERENCE BETWEEN OBS AND FCST IS COMPLETED IF(INEST.EQ.1)THEN INPF=NPFI @@ -2549,7 +2577,7 @@ SUBROUTINE calc_pottemp_scales(ivar, rcp, pb, p, tscale, & END SUBROUTINE calc_pottemp_scales SUBROUTINE print_obs_info(iprt,inest,niobf,rio,rjo,rko, & - prt_max,prt_freq,obs,lat,lon, & + prt_max,prt_freq,obs,stnid,lat,lon, & mlat,mlon,timeob,xtime) !************************************************************************* ! Purpose: Print obs information. @@ -2565,18 +2593,21 @@ SUBROUTINE print_obs_info(iprt,inest,niobf,rio,rjo,rko, & REAL, intent(in) :: rko(niobf) ! Bottom-top north coord (non-stagger) INTEGER, intent(in) :: prt_max ! Max no. of obs for diagnostic printout INTEGER, intent(in) :: prt_freq ! Frequency for diagnostic printout - INTEGER, intent(inout) :: obs(prt_max) ! Saved obs indices to print - REAL, intent(inout) :: lat(prt_max) ! Saved latitudes - REAL, intent(inout) :: lon(prt_max) ! Saved longitudes - REAL, intent(inout) :: mlat(prt_max) ! Saved model latitudes - REAL, intent(inout) :: mlon(prt_max) ! Saved longitudes + INTEGER, intent(in) :: obs(prt_max) ! Saved obs indices to print + INTEGER, intent(in) :: stnid(40,prt_max) ! Saved station ids + REAL, intent(in) :: lat(prt_max) ! Saved latitudes + REAL, intent(in) :: lon(prt_max) ! Saved longitudes + REAL, intent(in) :: mlat(prt_max) ! Saved model latitudes + REAL, intent(in) :: mlon(prt_max) ! Saved longitudes REAL, intent(in) :: timeob(niobf) ! Times of each observation (hours) REAL, intent(in) :: xtime ! Model time in minutes ! Local variables + integer :: i ! Loop counter over obs station chars integer :: n ! Loop counter over obs integer :: pnx ! Obs index for printout character(len=200) :: msg ! Argument to wrf_message + character(len=20) :: station_id ! Station id of observation if(iprt) then if(prt_max.gt.0) then @@ -2584,17 +2615,18 @@ SUBROUTINE print_obs_info(iprt,inest,niobf,rio,rjo,rko, & if(obs(1).ne.-999) then call wrf_message("") - write(msg,'(a,i4,a,f8.1,a)') 'REPORTING OBS MASS-PT LOCS FOR NEST ', & + write(msg,fmt='(a,i4,a,f8.1,a)') 'REPORTING OBS MASS-PT LOCS FOR NEST ', & inest,' AT XTIME=',xtime,' MINUTES' call wrf_message(msg) - write(msg,'(a,i4,a,i5,a)') 'FREQ=',prt_freq,', MAX=',prt_max, & + write(msg,fmt='(a,i4,a,i5,a)') 'FREQ=',prt_freq,', MAX=',prt_max, & ' LOCS, NEWLY READ OBS ONLY, -999 => OBS OFF PROC' call wrf_message(msg) call wrf_message("") - write(msg,'(a,a)') ' OBS# I J K OBS LAT', & - ' OBS LON XLAT(I,J) XLONG(I,J) TIME(hrs)' + write(msg,fmt='(3a)') ' OBS# I J K OBS LAT', & + ' OBS LON XLAT(I,J) XLONG(I,J) TIME(hrs)', & + ' OBS STATION ID' call wrf_message(msg) endif @@ -2605,9 +2637,13 @@ SUBROUTINE print_obs_info(iprt,inest,niobf,rio,rjo,rko, & do n=1,prt_max pnx = obs(n) if(pnx.ne.-999) then - write(msg,'(2x,i7,3f8.3,2f9.3,2x,f9.3,2x,f9.3,3x,f6.2)') & +! Retrieve 15 chars of station id + do i = 1,15 + station_id(i:i) = char(stnid(i,n)) + enddo + write(msg,fmt='(2x,i7,3f8.3,2f9.3,2x,f9.3,2x,f9.3,3x,f6.2,7x,a15)') & pnx,rio(pnx)-.5,rjo(pnx)-.5,rko(pnx),lat(n),lon(n), & - mlat(n),mlon(n),timeob(pnx) + mlat(n),mlon(n),timeob(pnx),station_id call wrf_message(msg) endif enddo @@ -2615,7 +2651,7 @@ SUBROUTINE print_obs_info(iprt,inest,niobf,rio,rjo,rko, & endif END SUBROUTINE print_obs_info - REAL FUNCTION ht_to_p( h, pbbc, ppbc, z_at_w, ic, jc, dx, dy, & + REAL FUNCTION ht_to_p( h, pbbc, ppbc, z, ic, jc, dx, dy, & k_start, k_end, kds,kde, ims,ime, jms,jme, kms,kme ) !****************************************************************************** @@ -2623,7 +2659,7 @@ REAL FUNCTION ht_to_p( h, pbbc, ppbc, z_at_w, ic, jc, dx, dy, & ! The input pressure column pbbc+ppbc (base and perturbn) must already ! be horizontally interpolated to the x, y position. The subroutine ! get_height_column is called here to horizontally interpolated the -! 3D height field z_at_w to get a height column at (iob, job). +! 3D height field z to get a height column at (iob, job). !****************************************************************************** IMPLICIT NONE @@ -2634,7 +2670,7 @@ REAL FUNCTION ht_to_p( h, pbbc, ppbc, z_at_w, ic, jc, dx, dy, & INTEGER, INTENT(IN) :: ims,ime, jms,jme, kms,kme ! memory dims. REAL, INTENT(IN) :: pbbc(kds:kde) ! column base pressure (cb) REAL, INTENT(IN) :: ppbc(kds:kde) ! column pressure perturbation (cb) - REAL, INTENT(IN) :: z_at_w( ims:ime, kms:kme, jms:jme ) ! height (m) on full (w) levels + REAL, INTENT(IN) :: z( ims:ime, kms:kme, jms:jme ) ! ht (m) above sl on half-levels INTEGER, INTENT(IN) :: ic ! i-coord of desired p INTEGER, INTENT(IN) :: jc ! j-coord of desired p REAL, INTENT(IN) :: dx ! interp. fraction (x dir) @@ -2651,8 +2687,8 @@ REAL FUNCTION ht_to_p( h, pbbc, ppbc, z_at_w, ic, jc, dx, dy, & REAL :: ln_phi ! log phi REAL :: z_at_p( kms:kme ) ! height at p levels -! Calculate z at p levels. - call get_height_column(z_at_w, ic, jc, dx, dy, z_at_p, & +! Get interpolated z column on pressure (half-) levels at (ic,jc) + call get_height_column(z, ic, jc, dx, dy, z_at_p, & k_start, k_end, kds,kde, & ims,ime, jms,jme, kms,kme ) @@ -2686,7 +2722,7 @@ REAL FUNCTION ht_to_p( h, pbbc, ppbc, z_at_w, ic, jc, dx, dy, & RETURN END FUNCTION ht_to_p - SUBROUTINE get_height_column( z_at_w, ic, jc, dx, dy, z_at_p, & + SUBROUTINE get_height_column( z, ic, jc, dx, dy, z_at_p, & k_start, k_end, kds,kde, & ims,ime, jms,jme, kms,kme ) !************************************************************************* @@ -2698,7 +2734,7 @@ SUBROUTINE get_height_column( z_at_w, ic, jc, dx, dy, z_at_p, & INTEGER, INTENT(IN) :: k_start, k_end ! Loop bounds INTEGER, INTENT(IN) :: kds,kde ! vertical dim. INTEGER, INTENT(IN) :: ims,ime, jms,jme, kms,kme ! memory dims. - REAL, INTENT(IN) :: z_at_w( ims:ime, kms:kme, jms:jme ) ! ht(m) on full (w) levels + REAL, INTENT(IN) :: z( ims:ime, kms:kme, jms:jme ) ! ht (m) on half-levels INTEGER, INTENT(IN) :: ic ! i-coord of desired p INTEGER, INTENT(IN) :: jc ! j-coord of desired p REAL, INTENT(IN) :: dx ! interp. fraction (x dir) @@ -2707,20 +2743,16 @@ SUBROUTINE get_height_column( z_at_w, ic, jc, dx, dy, z_at_p, & ! Local variables INTEGER :: k ! loop counter - REAL :: zw_int(kds:kde) ! horizonatlly interpolated column height at w levels do k = kds, kde - zw_int(k) = & - (1.-DY)*( (1.-DX)*z_at_w(IC,K,JC) + & - DX *z_at_w(IC+1,K,JC) ) + & - DY* ( (1.-DX)*z_at_w(IC,K,JC+1) + & - DX *z_at_w(IC+1,K,JC+1) ) + z_at_p(k) = & + (1.-DY)*( (1.-DX)*z(IC,K,JC) + & + DX *z(IC+1,K,JC) ) + & + DY* ( (1.-DX)*z(IC,K,JC+1) + & + DX *z(IC+1,K,JC+1) ) enddo - do k = k_start, k_end - z_at_p(k) = 0.5*(zw_int(k) +zw_int(k+1)) - enddo END SUBROUTINE get_height_column SUBROUTINE get_base_state_height_column( p_top, p00, t00, a, g, r_d, & @@ -2839,13 +2871,13 @@ SUBROUTINE print_vif_var(var, vif, nfullmin, nrampmin ) nrampr4 = vif(6) if(var.eq.'wind') then - write(msg1,'(a)') ' For winds:' + write(msg1,'a') ' For winds:' elseif (var.eq.'temp') then - write(msg1,'(a)') ' For temperature:' + write(msg1,'a') ' For temperature:' elseif (var.eq.'mois') then - write(msg1,'(a)') ' For moisture:' + write(msg1,'a') ' For moisture:' else - write(msg1,'(a,a4)') 'Unknown variable type: ',var + write(msg1,'a,a4') 'Unknown variable type: ',var call wrf_error_fatal ( 'print_vif_var: module_fddaobs_rtfdda STOP' ) endif @@ -2876,45 +2908,45 @@ SUBROUTINE print_vif_regime(reg, nfullr, nrampr, nfullmin, nrampmin ) character(len=8) :: regime if(reg.eq.1) then - write(regime,'(a)') 'Regime 1' + write(regime,'a') 'Regime 1' elseif (reg.eq.2) then - write(regime,'(a)') 'Regime 2' + write(regime,'a') 'Regime 2' elseif (reg.eq.4) then - write(regime,'(a)') 'Regime 4' + write(regime,'a') 'Regime 4' else - write(msg1,'(a,i3)') 'Unknown regime number: ',reg + write(msg1,'a,i3') 'Unknown regime number: ',reg call wrf_error_fatal ( 'print_vif_regime: module_fddaobs_rtfdda STOP' ) endif !Set msg1 for description of full weighting range if(nfullr.lt.0) then if(nfullr.eq.-5000) then - write(msg1,'(2x,a8,a)') regime, ': Full weighting to the PBL top' + write(msg1,'2x,a8,a') regime, ': Full weighting to the PBL top' elseif (nfullr.lt.-5000) then - write(msg1,'(2x,a8,a,i4,a)') regime, ': Full weighting to ',int(-5000.-nfullr), & + write(msg1,'2x,a8,a,i4,a') regime, ': Full weighting to ',int(-5000.-nfullr), & ' m above the PBL top' else - write(msg1,'(2x,a8,a,i4,a)') regime, ': Full weighting to ',int(nfullr+5000.), & + write(msg1,'2x,a8,a,i4,a') regime, ': Full weighting to ',int(nfullr+5000.), & ' m below the PBL top' endif else - write(msg1,'(2x,a8,a,i4,a)') regime, ': Full weighting through ', & + write(msg1,'2x,a8,a,i4,a') regime, ': Full weighting through ', & int(max(nfullr,nfullmin)),' m' endif !Set msg2 for description of rampdown range if(nrampr.lt.0) then if(nrampr.eq.-5000) then - write(msg2,'(a)') ' and a vertical rampdown up to the PBL top.' + write(msg2,'a') ' and a vertical rampdown up to the PBL top.' elseif (nrampr.lt.-5000) then - write(msg2,'(a,i4,a)') ' and a vertical rampdown to ',int(-5000.-nrampr), & + write(msg2,'a,i4,a') ' and a vertical rampdown to ',int(-5000.-nrampr), & ' m above the PBL top.' else - write(msg2,'(a,i4,a)') ' and a vertical rampdown to ',int(nrampr+5000.), & + write(msg2,'a,i4,a') ' and a vertical rampdown to ',int(nrampr+5000.), & ' m below the PBL top.' endif else - write(msg2,'(a,i4,a)') ' and a vertical rampdown in the next ', & + write(msg2,'a,i4,a') ' and a vertical rampdown in the next ', & int(max(nrampr,nrampmin)),' m.' endif call wrf_message(TRIM(msg1)//msg2) diff --git a/phys/module_fr_sfire_driver.F b/phys/module_fr_sfire_driver.F index 30204b0132..70e2b348cb 100644 --- a/phys/module_fr_sfire_driver.F +++ b/phys/module_fr_sfire_driver.F @@ -5,8 +5,7 @@ ! For support please subscribe to the wrf-fire mailing list at NCAR at ! http://mailman.ucar.edu/mailman/listinfo/wrf-fire -! -! ALL RESPONSES TO INQUIRIES ABOUT THIS CODE WILL BE COPIED TO THE wrf-fire LIST +! or go to http://www.openwfm.org/wiki/index.php5/Talk:WRF-Fire ! This module is the only entry point from WRF-ARW to the wildland ! fire model. The call to sfire_driver advances the fire model by @@ -25,6 +24,9 @@ ! propagation by tracers and was coupled with the Clark-Hall ! atmospheric code, described in [2]. For WRF documentation see [3]. +! If you use this code, please acknowledge our work by citing [1]. +! Thank you. + ! Acknowledgements ! ! Contributions to development of the level set @@ -228,7 +230,7 @@ subroutine sfire_driver_em ( grid , config_flags & fire_ignition_time, & fire_ignition_radius integer::fire_ifun,ir,jr,fire_ignition_longlat,istep,itimestep - logical::need_lfn_update + logical::need_lfn_update,restart !real, dimension(ifms:ifme, jfms:jfme)::uf,vf,lfn_out ! uf vf only do not need to be in the state but we need halo on them real, dimension(ifms:ifme, jfms:jfme)::lfn_out @@ -269,6 +271,7 @@ subroutine sfire_driver_em ( grid , config_flags & ir=grid%sr_x ! refinement ratio jr=grid%sr_y itimestep=grid%itimestep + restart=config_flags%restart @@ -333,7 +336,7 @@ subroutine sfire_driver_em ( grid , config_flags & grid%num_tiles, & ! atm grid tiling grid%i_start,min(grid%i_end,ide-1), & grid%j_start,min(grid%j_end,jde-1), & - itimestep,config_flags%fire_fuel_read,config_flags%fire_fuel_cat, & ! in scalars + itimestep,restart,config_flags%fire_fuel_read,config_flags%fire_fuel_cat, & ! in scalars grid%dt,grid%dx,grid%dy, & grid%u_frame,grid%v_frame, & unit_fxlong,unit_fxlat, & ! coordinates of grid center @@ -389,7 +392,7 @@ subroutine sfire_driver_phys (ifun,need_lfn_update, & ifps, ifpe, jfps, jfpe, & ! fire patch in - will use smaller ir,jr, & ! atm/fire grid ratio num_tiles,i_start,i_end,j_start,j_end, & ! atm grid tiling - itimestep,ifuelread,nfuel_cat0,dt,dx,dy, & ! in scalars + itimestep,restart,ifuelread,nfuel_cat0,dt,dx,dy, & ! in scalars u_frame,v_frame, & unit_fxlong,unit_fxlat, & ! fxlong, fxlat units in m fire_ext_grnd,fire_ext_crwn,fire_crwn_hgt, & @@ -436,6 +439,8 @@ subroutine sfire_driver_phys (ifun,need_lfn_update, & ! 2=from file nfuel_cat0, & ! fuel category to initialize everything to num_tiles ! number of tiles + +logical, intent(in)::restart logical, intent(out)::need_lfn_update @@ -608,6 +613,12 @@ subroutine sfire_driver_phys (ifun,need_lfn_update, & if(ifun.eq.1)then ! set terrain + if(restart)then + + call message('restart - topo initialization skipped') + + else + call print_2d_stats(ips,ipe,jps,jpe,ims,ime,jms,jme,zs,'driver:zs') ! interpolate terrain height @@ -670,10 +681,13 @@ subroutine sfire_driver_phys (ifun,need_lfn_update, & endif + endif + elseif(ifun.eq.2)then ! after the loop where zsf created exited and all synced call print_2d_stats(ifts,ifte,jfts,jfte,ifms,ifme,jfms,jfme,zsf,'driver_phys:zsf') + elseif(ifun.eq.3)then ! interpolate winds to the fire grid call interpolate_atm2fire(id, & ! flag for debug output @@ -691,7 +705,9 @@ subroutine sfire_driver_phys (ifun,need_lfn_update, & endif - call sfire_model (id,ifun,need_lfn_update, & +! the following executes in any case + + call sfire_model (id,ifun,restart,need_lfn_update, & num_ignitions, & ! switches ifuelread,nfuel_cat0, & ! initialize fuel categories ifds,ifde,jfds,jfde, & ! fire domain dims @@ -1217,7 +1233,7 @@ end subroutine set_flags subroutine print_id character(len=128)::id,msg -id='1cd1cafa379642cfc5772470ef62206a53076271' +id='b6fe89aeb71d941e91530aafcf2f5b183a44fc37' msg=id call message(msg) end subroutine print_id diff --git a/phys/module_fr_sfire_model.F b/phys/module_fr_sfire_model.F index c39f7f970c..ad7da4c14d 100644 --- a/phys/module_fr_sfire_model.F +++ b/phys/module_fr_sfire_model.F @@ -15,6 +15,7 @@ module module_fr_sfire_model subroutine sfire_model ( & id, & ! unique number for prints and debug ifun, & ! what to do see below + restart, & need_lfn_update, & ! if lfn needs to be synced between tiles num_ignitions, & ! number of ignitions before advancing ifuelread,nfuel_cat0, & ! initialize fuel categories @@ -88,6 +89,7 @@ subroutine sfire_model ( & ! 4 = do one timestep ! 5 = copy timestep output to input ! 6 = compute output fluxes +logical, intent(in):: restart ! if true, use existing state logical, intent(out)::need_lfn_update ! if true, halo update on lfn afterwards ! scalar data integer, intent(in) :: num_ignitions ! number of ignition locations/times @@ -173,7 +175,7 @@ subroutine sfire_model ( & ifts,ifte,jfts,jfte, & ! tile dims zsf) ! array - call set_nfuel_cat( & + if(.not.restart)call set_nfuel_cat( & ifms,ifme,jfms,jfme, & ifts,ifte,jfts,jfte, & ifuelread,nfuel_cat0,& @@ -181,7 +183,7 @@ subroutine sfire_model ( & ! uses nfuel_cat to set the other fuel data arrays ! needs zsf on halo width 1 to compute the terrain gradient - call set_fire_params( & + if(.not.restart)call set_fire_params( & ifds,ifde,jfds,jfde, & ifms,ifme,jfms,jfme, & ifts,ifte,jfts,jfte, & @@ -193,14 +195,17 @@ subroutine sfire_model ( & call print_2d_stats(ifts,ifte,jfts,jfte,ifms,ifme,jfms,jfme,zsf,'model: terrain height') ! initialize model state to no fire - call init_no_fire ( & + if(.not.restart)then + call init_no_fire ( & ifds,ifde,jfds,jfde, & ifms,ifme,jfms,jfme, & ifts,ifte,jfts,jfte, & fdx,fdy,time_start, & fuel_frac,fire_area,lfn,tign) - need_lfn_update=.true. ! because we have set lfn + need_lfn_update=.true. ! because we have set lfn + + endif elseif(ifun.eq.3)then ! ignition if so specified diff --git a/phys/module_physics_init.F b/phys/module_physics_init.F index 597e88650c..be15237984 100644 --- a/phys/module_physics_init.F +++ b/phys/module_physics_init.F @@ -638,6 +638,9 @@ SUBROUTINE phy_init ( id, config_flags, DT, restart, zfull, zhalf, & model_config_rec%obs_sfcfact, & model_config_rec%obs_sfcfacr, & model_config_rec%obs_dpsmx, & + model_config_rec%obs_nudge_wind, & + model_config_rec%obs_nudge_temp, & + model_config_rec%obs_nudge_mois, & model_config_rec%obs_nudgezfullr1_uv, & model_config_rec%obs_nudgezrampr1_uv, & model_config_rec%obs_nudgezfullr2_uv, & @@ -2178,6 +2181,7 @@ SUBROUTINE fdob_init(obs_nudge_opt, maxdom, inest, parid, & no_pbl_nudge_t, & no_pbl_nudge_q, & sfcfact, sfcfacr, dpsmx, & + nudge_wind, nudge_temp, nudge_mois, & nudgezfullr1_uv, nudgezrampr1_uv, & nudgezfullr2_uv, nudgezrampr2_uv, & nudgezfullr4_uv, nudgezrampr4_uv, & @@ -2225,6 +2229,9 @@ SUBROUTINE fdob_init(obs_nudge_opt, maxdom, inest, parid, & REAL , INTENT(IN) :: sfcfact ! scale factor applied to time window for surface obs REAL , INTENT(IN) :: sfcfacr ! scale fac applied to horiz rad of infl for sfc obs REAL , INTENT(IN) :: dpsmx ! max pressure change allowed within horiz. infl. range + INTEGER , INTENT(IN) :: nudge_wind(maxdom) ! wind-nudging flag + INTEGER , INTENT(IN) :: nudge_temp(maxdom) ! temperature-nudging flag + INTEGER , INTENT(IN) :: nudge_mois(maxdom) ! moisture-nudging flag REAL , INTENT(IN) :: nudgezfullr1_uv ! vert infl fcn, regime=1 full-wt hght, winds REAL , INTENT(IN) :: nudgezrampr1_uv ! vert infl fcn, regime=1 ramp down hght, winds REAL , INTENT(IN) :: nudgezfullr2_uv ! vert infl fcn, regime=2 full-wt hght, winds @@ -2277,6 +2284,7 @@ SUBROUTINE fdob_init(obs_nudge_opt, maxdom, inest, parid, & no_pbl_nudge_t, & no_pbl_nudge_q, & sfcfact, sfcfacr, dpsmx, & + nudge_wind, nudge_temp, nudge_mois, & nudgezfullr1_uv, nudgezrampr1_uv, & nudgezfullr2_uv, nudgezrampr2_uv, & nudgezfullr4_uv, nudgezrampr4_uv, & diff --git a/share/wrf_fddaobs_in.F b/share/wrf_fddaobs_in.F index c7eb1e5413..206db4c1eb 100644 --- a/share/wrf_fddaobs_in.F +++ b/share/wrf_fddaobs_in.F @@ -112,6 +112,7 @@ SUBROUTINE wrf_fddaobs_in (grid ,config_flags) grid%fdob%obsprt, & grid%fdob%latprt, grid%fdob%lonprt, & grid%fdob%mlatprt, grid%fdob%mlonprt, & + grid%fdob%stnidprt, & ide, jde, & ims, ime, jms, jme, & its, ite, jts, jte, & @@ -119,7 +120,7 @@ SUBROUTINE wrf_fddaobs_in (grid ,config_flags) model_config_rec%parent_grid_ratio, & model_config_rec%i_parent_start(inest), & model_config_rec%j_parent_start(inest), & - model_config_rec%max_dom, grid%fdob%refprt, & + model_config_rec%max_dom, & model_config_rec%nobs_ndg_vars, grid%max_obs, iprt_in4dob) ENDDO !$OMP END PARALLEL DO @@ -154,6 +155,7 @@ SUBROUTINE in4dob(inest, xtime, ktau, ktaur, dtmin, & obs_prt, & lat_prt, lon_prt, & mlat_prt, mlon_prt, & + stnid_prt, & e_we, e_sn, & ims, ime, jms, jme, & its, ite, jts, jte, & @@ -161,7 +163,7 @@ SUBROUTINE in4dob(inest, xtime, ktau, ktaur, dtmin, & parent_grid_ratio, & i_parent_start, & j_parent_start, & - maxdom, refprt, & + maxdom, & nndgv, niobf, iprt) USE module_domain @@ -249,6 +251,7 @@ SUBROUTINE in4dob(inest, xtime, ktau, ktaur, dtmin, & REAL, intent(inout) :: lon_prt(prt_max) ! For printout of obs longitude REAL, intent(inout) :: mlat_prt(prt_max) ! For printout of model lat at obs (ri,rj) REAL, intent(inout) :: mlon_prt(prt_max) ! For printout of model lon at obs (ri,rj) + INTEGER, intent(inout) :: stnid_prt(40,prt_max) ! For printout of model lon at obs (ri,rj) INTEGER, intent(in) :: e_we ! max grid index in south-north coordinate INTEGER, intent(in) :: e_sn ! max grid index in west-east coordinate INTEGER, intent(in) :: ims ! grid memory start index (west-east dim) @@ -264,15 +267,14 @@ SUBROUTINE in4dob(inest, xtime, ktau, ktaur, dtmin, & INTEGER, intent(in) :: i_parent_start ! starting i coordinate in parent domain INTEGER, intent(in) :: j_parent_start ! starting j coordinate in parent domain INTEGER, intent(in) :: maxdom ! maximum number of domains - INTEGER, intent(inout) :: refprt(maxdom) ! reference obs index for printout LOGICAL, intent(in) :: iprt ! print flag !*** DECLARATIONS FOR IMPLICIT NONE integer :: n, ndum, nopen, nvol, idate, imm, iss - integer :: nlast ! the (very) last obs in the list + integer :: nlast ! last obs in list of valid obs from prev window integer :: nsta ! number of stations held in timeobs array integer :: nstaw ! # stations within the actual time window - integer :: nprev=0 ! previous n in obs read loop (for printout only) + integer :: nprev ! previous n in obs read loop (for printout only) integer :: meas_count, imc, njend, njc, njcc, julob, kn real :: hourob, rjulob real :: xhour, tback, tforwd, rjdate1, timanl1, rtimob @@ -294,8 +296,6 @@ SUBROUTINE in4dob(inest, xtime, ktau, ktaur, dtmin, & character*2 fonc character(len=200) :: msg ! Argument to wrf_message real latitude,longitude - real :: plat_prt=0.0 ! Previous obs latitude in read loop (used for printout) - real :: plon_prt=0.0 ! Previous obs longitude in read loop (used for printout) logical :: newpass ! New pass flag (used for printout) logical is_sound,bogus LOGICAL OPENED,exist @@ -304,8 +304,7 @@ SUBROUTINE in4dob(inest, xtime, ktau, ktaur, dtmin, & data ifon/0,0,0,0,0/ integer :: nmove, nvola integer :: iyear, itimob !obsnypatch -! external :: fcst_hours !obsnypatch -! real :: fcst_hours !obsnypatch + integer :: errcnt DATA NMOVE/0/,NVOLA/61/ ! if(ieof(inest).eq.2.and.fdob%nstat.eq.0)then @@ -318,6 +317,7 @@ SUBROUTINE in4dob(inest, xtime, ktau, ktaur, dtmin, & ! Initialize obs for printout obs_prt = -999 newpass = .true. + errcnt = 0 ! if start time, or restart time, set obs array to missing value IF(KTAU.EQ.0.OR.KTAU.EQ.KTAUR) THEN @@ -333,8 +333,6 @@ SUBROUTINE in4dob(inest, xtime, ktau, ktaur, dtmin, & XHOUR=XTIME/60. XHOUR=AMAX1(XHOUR,0.0) -10 CONTINUE - ! DEFINE THE MAX LIMITS OF THE WINDOW TBACK=XHOUR-TWINDO TFORWD=XHOUR+TWINDO @@ -360,7 +358,7 @@ SUBROUTINE in4dob(inest, xtime, ktau, ktaur, dtmin, & ENDDO t_window IF (iprt .and. ndum>0) THEN - write(msg,'(a,i5,2a)') 'OBS NUDGING: ',ndum,' previously read obs ', & + write(msg,fmt='(a,i5,2a)') 'OBS NUDGING: ',ndum,' previously read obs ', & 'are now too old for the current window and have been removed.' call wrf_message(msg) ENDIF @@ -463,7 +461,6 @@ SUBROUTINE in4dob(inest, xtime, ktau, ktaur, dtmin, & 1001 continue ! ieof=2 means no more files -! print *,'after 1001,n,timeob(n)=',n,timeob(n) IF(IEOF(inest).GT.1) then GOTO 130 @@ -478,6 +475,7 @@ SUBROUTINE in4dob(inest, xtime, ktau, ktaur, dtmin, & ENDIF ! OBSFILE: no more data in the obsfile +! AJB note: This is where we would implement multi-file reading. if(ieof(inest).eq.1 )then ieof(inest)=2 goto 130 @@ -486,9 +484,9 @@ SUBROUTINE in4dob(inest, xtime, ktau, ktaur, dtmin, & !********************************************************************** ! -------------- 110 SUBLOOP OVER N -------------- !********************************************************************** + 110 continue ! THE TIME OF THE MOST RECENTLY ACQUIRED OBS IS .LE. TFORWD, ! SO CONTINUE READING - 110 continue IF(N.GT.NIOBF-1)GOTO 120 ! REPLACE NVOLA WITH LUN 70, AND USE NVOLA AS A FILE COUNTER @@ -531,13 +529,6 @@ SUBROUTINE in4dob(inest, xtime, ktau, ktaur, dtmin, & read(nvol,102)latitude,longitude 102 FORMAT(2x,2(f9.4,1x)) -! save obs and model latitude and longitude for printout - CALL collect_obs_info(newpass,inest,n,latitude,longitude,nprev,niobf, & - refprt(inest),rio,rjo,prt_max,prt_freq,xlat,xlong, & - obs_prt,lat_prt,lon_prt,mlat_prt,mlon_prt, & - plat_prt,plon_prt, e_we,e_sn, & - ims,ime,jms,jme,its,ite,jts,jte) - ! if(ifon.eq.4)print *,'ifon=4',latitude,longitude ! this works only for lc projection ! yliu: add llxy for all 3 projection @@ -593,6 +584,7 @@ SUBROUTINE in4dob(inest, xtime, ktau, ktaur, dtmin, & if(platform(7:10).eq.'TEMP')plfo(n)=5. if(platform(7:11).eq.'PILOT')plfo(n)=6. if(platform(1:7).eq.'SATWNDS')plfo(n)=7. + if(platform(7:11).eq.'SATWI')plfo(n)=7. if(platform(1:4).eq.'SAMS')plfo(n)=8. if(platform(7:14).eq.'PROFILER')plfo(n)=9. ! yliu: ACARS->SATWINDS @@ -744,9 +736,12 @@ SUBROUTINE in4dob(inest, xtime, ktau, ktaur, dtmin, & varobs(5,n)=-888888. IF (iprt) THEN if(varobs(6,n).eq.-888888.000) then - call wrf_message("********** PROBLEM *************") - write(msg,*) 'sounding, p and ht undefined',latitude,longitude - call wrf_message(msg) + if (errcnt.le.10) then + write(msg,*) '*** PROBLEM: sounding, p and ht undefined',latitude,longitude + call wrf_message(msg) + errcnt = errcnt + 1 + if (errcnt.gt.10) call wrf_message("MAX of 10 warnings issued.") + endif endif ENDIF endif @@ -1066,12 +1061,12 @@ SUBROUTINE in4dob(inest, xtime, ktau, ktaur, dtmin, & n=n-1 goto 100 else - IF (iprt) THEN - write(msg,*) 'duplicate location, but no match otherwise',n,njc, & - plfo(n),varobs(5,n),nlevs_ob(n),lev_in_ob(n), & - plfo(njc),varobs(5,njc),nlevs_ob(njc),lev_in_ob(njc) - call wrf_message(msg) - ENDIF +! IF (iprt) THEN +! write(msg,*) 'duplicate location, but no match otherwise',n,njc, & +! plfo(n),varobs(5,n),nlevs_ob(n),lev_in_ob(n), & +! plfo(njc),varobs(5,njc),nlevs_ob(njc),lev_in_ob(njc) +! call wrf_message(msg) +! ENDIF endif endif endif @@ -1086,40 +1081,18 @@ SUBROUTINE in4dob(inest, xtime, ktau, ktaur, dtmin, & goto 100 endif -! ajb bugfix begin: -!! check if ob is in coarse mesh domain (061404 switched sn/we) -! if( (ri.lt.2.).or.(ri.gt.real(we_maxcg-1)).or.(rj.lt.2.).or. & -! (rj.gt.real(sn_maxcg-1)) ) then - ! check if ob is in the domain - if( (ri.lt.2.).or.(ri.gt.real(e_we-1)).or.(rj.lt.2.).or. & - (rj.gt.real(e_sn-1)) ) then + if( (ri.lt.2.).or.(ri.gt.real(e_we-1)).or.(rj.lt.2.).or. & + (rj.gt.real(e_sn-1)) ) then - n=n-meas_count + n=n-meas_count !ajb Reset timeob for discarded indices. - do imc = n+1, n+meas_count - timeob(imc) = 99999. - enddo - goto 100 - endif + do imc = n+1, n+meas_count + timeob(imc) = 99999. + enddo + goto 100 + endif -! check if an upper air ob is too high -! the ptop here is hardwired -! this check has to come after other checks - usually the last few -! upper air obs are too high -! if(is_sound)then -! njc=meas_count -! do jcj=meas_count,1,-1 -! 6. is 60 mb - hardwired -! if((varobs(5,n).lt.6.).and.(varobs(5,n).gt.0.))then -! print *,'obs too high - eliminate,n,p=',n,varobs(5,n) -! n=n-1 -! else -! if(varobs(5,n).gt.0.)goto 100 -! endif -! enddo -! endif -! IF(TIMEOB(N).LT.fdob%RTLAST) THEN IF (iprt) THEN call wrf_message("2 OBS ARE NOT IN CHRONOLOGICAL ORDER") @@ -1131,6 +1104,12 @@ SUBROUTINE in4dob(inest, xtime, ktau, ktaur, dtmin, & ELSE fdob%RTLAST=TIMEOB(N) ENDIF +! Save obs and model latitude and longitude for printout + CALL collect_obs_info(newpass,inest,n,latitude,longitude, & + nlast,nprev,niobf,id,stnid_prt, & + rio,rjo,prt_max,prt_freq,xlat,xlong, & + obs_prt,lat_prt,lon_prt,mlat_prt,mlon_prt, & + e_we,e_sn,ims,ime,jms,jme,its,ite,jts,jte) GOTO 100 111 CONTINUE !********************************************************************** @@ -1149,34 +1128,27 @@ SUBROUTINE in4dob(inest, xtime, ktau, ktaur, dtmin, & call wrf_message(msg) ENDIF -! if(nsta.eq.1.and.timeob(1).gt.9.e4)nsta=0 +! AJB note: Go back and check for more files. (Multi-file implementation) goto 1001 +120 CONTINUE ! THE OBSERVATION ARRAYS ARE FULL AND THE MOST RECENTLY ! ACQUIRED OBS STILL HAS TIMEOB .LE. TFORWD. SO START ! DECREASING THE SIZE OF THE WINDOW ! get here if too many obs -120 CONTINUE IF (iprt) THEN write(msg,121) N,NIOBF call wrf_message(msg) - write(msg,122) - call wrf_message(msg) ENDIF call wrf_error_fatal ( 'wrf_fddaobs_in: in4dob STOP 122' ) - TWINDO=TWINDO-0.1*TWINDO - IF(TWINDO.LT.0) call wrf_error_fatal ( 'wrf_fddaobs_in: in4dob STOP 120' ) -! IF THE WINDOW BECOMES NEGATIVE, THE INCOMING DATA IS -! PROBABLY GARBLED. STOP. - GOTO 10 -! + +130 CONTINUE ! READ CYCLE IS COMPLETED. DETERMINE THE NUMBER OF OBS IN ! THE CURRENT WINDOW ! !CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC ! BUT FIRST, WHEN KTAU.EQ.0 (OR IN GENERAL, KTAUR), DISCARD THE ! "OLD" OBS FIRST... -130 CONTINUE ! Get here if at end of file, or if obs time is beyond what we need right now. ! On startup, we report the index of the last obs read. @@ -1266,12 +1238,6 @@ SUBROUTINE in4dob(inest, xtime, ktau, ktaur, dtmin, & ! Find the number of stations that are actually within the time window. nstaw = nvals_le_limit(nsta, timeob, tforwd) - CALL finish_obs_info(iprt,nstaw,niobf,rio,rjo,prt_max,prt_freq, & - xlat,xlong,e_we,e_sn,refprt(inest),obs_prt, & - lat_prt,lon_prt,mlat_prt,mlon_prt, & - plat_prt,plon_prt,xtime, & - ims,ime,jms,jme,its,ite,jts,jte) - IF (iprt) then write(msg,160) KTAU,XTIME,NSTAW call wrf_message(msg) @@ -1286,22 +1252,28 @@ SUBROUTINE in4dob(inest, xtime, ktau, ktaur, dtmin, & write(msg,1450) GIV call wrf_message(msg) ELSE - write(msg,1455) + write(msg,1455) INEST + call wrf_message("") call wrf_message(msg) + call wrf_message("") ENDIF IF(ISTEMP.EQ.1) then write(msg,1451) GIT call wrf_message(msg) ELSE - write(msg,1456) + write(msg,1456) INEST + call wrf_message("") call wrf_message(msg) ENDIF IF(ISMOIS.EQ.1) then + call wrf_message("") write(msg,1452) GIQ call wrf_message(msg) ELSE - write(msg,1457) + write(msg,1457) INEST + call wrf_message("") call wrf_message(msg) + call wrf_message("") ENDIF ENDIF ENDIF @@ -1352,7 +1324,6 @@ SUBROUTINE in4dob(inest, xtime, ktau, ktaur, dtmin, & I4,': INCREASE PARAMETER NIOBF') 5403 FORMAT(1H0,'-------------EOF REACHED FOR NVOL = ',I3, & ' AND XTIME = ',F10.2,'-------------------') -122 FORMAT(1X,' ...OR THE CODE WILL REDUCE THE TIME WINDOW') 160 FORMAT('****** CALL IN4DOB AT KTAU = ',I5,' AND XTIME = ', & F10.2,': NSTA = ',I7,' ******') 1449 FORMAT('*****NUDGING INDIVIDUAL OBS ON MESH #',I2, & @@ -1362,9 +1333,9 @@ SUBROUTINE in4dob(inest, xtime, ktau, ktaur, dtmin, & 1450 FORMAT(1X,'NUDGING IND. OBS WINDS WITH GIV = ',E11.3) 1451 FORMAT(1X,'NUDGING IND. OBS TEMPERATURE WITH GIT = ',E11.3) 1452 FORMAT(1X,'NUDGING IND. OBS MOISTURE WITH GIQ = ',E11.3) -1455 FORMAT(1X,'*** OBS WIND NUDGING TURNED OFF FOR THIS MESH!!') -1456 FORMAT(1X,'*** OBS TEMPERATURE NUDGING IS TURNED OFF FOR THIS MESH!!') -1457 FORMAT(1X,'*** OBS MOISTURE NUDGING IS TURNED OFF FOR THIS MESH!!') +1455 FORMAT(1X,'*** OBS WIND NUDGING FOR MESH ',I2,' IS TURNED OFF!!') +1456 FORMAT(1X,'*** OBS TEMPERATURE NUDGING FOR MESH ',I2,' IS TURNED OFF!!') +1457 FORMAT(1X,'*** OBS MOISTURE NUDGING FOR MESH ',I2,' IS TURNED OFF!!') RETURN END SUBROUTINE in4dob @@ -1639,17 +1610,6 @@ SUBROUTINE set_projection (obs_proj, map_proj, cen_lat, cen_lon, & END IF -! write(6,*) 'ajb init: map_proj = ',map_proj -! write(6,*) 'ajb: after setting map:' -! write(6,*) 'truelat1 = ',obs_proj%truelat1 -! write(6,*) 'truelat2 = ',obs_proj%truelat2 -! write(6,*) 'stdlon = ',obs_proj%stdlon -! write(6,*) 'lat1 = ',obs_proj%lat1 -! write(6,*) 'lon1 = ',obs_proj%lon1 -! write(6,*) 'knowni = ',obs_proj%knowni -! write(6,*) 'knownj = ',obs_proj%knownj -! write(6,*) 'dx = ',obs_proj%dx - END SUBROUTINE set_projection SUBROUTINE fmt_date(idate,odate) !obsnypatch @@ -1704,21 +1664,35 @@ INTEGER FUNCTION nvals_le_limit(isize, values, limit) RETURN END FUNCTION nvals_le_limit - SUBROUTINE collect_obs_info(newpass,inest,n,latitude,longitude,nprev,niobf, & - iref,rio,rjo,prt_max,prt_freq,xlat,xlong,obs, & - lat,lon, mlat,mlon,plat,plon,e_we,e_sn, & - ims,ime,jms,jme,its,ite,jts,jte) + SUBROUTINE collect_obs_info(newpass,inest,n,latitude,longitude, & + nlast,nprev,niobf,station_id,stnid, & + rio,rjo,prt_max,prt_freq,xlat,xlong, & + obs, lat,lon, mlat,mlon, & + e_we,e_sn,ims,ime,jms,jme,its,ite,jts,jte) !************************************************************************* -! Purpose: Collect obs and model latitude and longitude values for print -! diagnostics. This is tricky because (1) THIS SUBROUTINE CALL IS -! WITHIN THE LOOP FOR READING THE OBServations, (2) observations -! can be rejected, and (3) soundings may contain multiple obs -! levels (i.e., n jumps by the number of levels in the sounding. -! Here, "prev" means the previous iteration of the read obs loop. -! NOTE: The lat/lon info for an obs is not actually stored until -! the read of the subsequent obs, because the number of -! levels in the obs, or even whether or not the obs has -! been accepted, is not known until the subsequent read. +! Purpose: Collect the obs index, obs latitude, obs longitude, obs station +! id, and model latitude and longitude values for print +! diagnostics. Note that THIS SUBROUTINE IS CALLED INTERATIVELY +! FROM IN4DOB, WITHIN THE OBS READ LOOP that reads new obser- +! vations needed for the new time window. Flag newpass is true +! the first time collect_obs_info is called from the read-loop +! for a new time window. So for each pass of IN4DOB, newpass is +! true the first time IN4DOB calls collec_obs_info. + +! OBS (soundings) contain multiple obs levels. So on each sub- +! sequent call of collect_obs_info for a specific pass of IN4DOB, +! n will jump by the number of levels in the sounding. +! +! Here, nlast refers to the index of the last valid-time obs +! that was read in during the last pass of IN4DOB (after the old +! obs were removed). This way we can properly start storing +! obs information for the new obs that are being read on this +! pass of IN4DOB, beginning with the first newly read obs for +! this pass of IN4DOB. +! +! Note that nprev is needed to properly handle soundings. On +! each pass, n is stored into nprev, and on each subsequent +! pass of collect_obs_info, a loop is performed from nprev+1 to n. !************************************************************************* IMPLICIT NONE @@ -1728,9 +1702,11 @@ SUBROUTINE collect_obs_info(newpass,inest,n,latitude,longitude,nprev,niobf, & INTEGER, intent(in) :: n ! Observation index REAL, intent(in) :: latitude ! Latitude of obs REAL, intent(in) :: longitude ! Latitude of obs - INTEGER, intent(inout) :: nprev ! Previous observation index + INTEGER, intent(in) :: nlast ! Last obs of valid obs, prev window + INTEGER, intent(inout) :: nprev ! Previous obs in new window read seq INTEGER, intent(in) :: niobf ! Maximum number of observations - INTEGER, intent(inout) :: iref ! Reference obs index + CHARACTER*15, intent(in) :: station_id ! First 15 chars of station id for obs n + INTEGER, intent(inout) :: stnid(40,prt_max) ! Station ids for diagnostic printout REAL, intent(in) :: rio(niobf) ! West-east coord (non-stagger) REAL, intent(in) :: rjo(niobf) ! South-north coord (non-stagger) INTEGER, intent(in) :: prt_max ! Max no. of obs for diagnostic printout @@ -1742,8 +1718,6 @@ SUBROUTINE collect_obs_info(newpass,inest,n,latitude,longitude,nprev,niobf, & REAL, intent(inout) :: lon(prt_max) ! Obs longitude for printout REAL, intent(inout) :: mlat(prt_max) ! Model latitude at (rio,rjo) for printout REAL, intent(inout) :: mlon(prt_max) ! Model longitude at (rio,rjo) for printout - REAL, intent(inout) :: plat ! Previous latitude read - REAL, intent(inout) :: plon ! Previous longitude read INTEGER, intent(in) :: e_we ! Max grid index in south-north INTEGER, intent(in) :: e_sn ! Max grid index in west-east INTEGER, intent(in) :: ims ! Grid mem start (west-east) @@ -1754,26 +1728,30 @@ SUBROUTINE collect_obs_info(newpass,inest,n,latitude,longitude,nprev,niobf, & INTEGER, intent(in) :: ite ! Grid tile end (west-east) INTEGER, intent(in) :: jts ! Grid tile start (south-north) INTEGER, intent(in) :: jte ! Grid tile end (south-north) + ! Local variables - integer nn ! Loop counter over obs index - integer ndx ! Index into printout arrays - real :: ri, rj ! Mass-pt coord of obs - integer :: ril, rjl ! Mass-pt integer coord immed sw of obs + integer i ! Loop counter over station id character + integer nn ! Loop counter over obs index + integer ndx,ndxp ! Index into printout arrays (ndx and prev ndx) + real :: ri, rj ! Mass-pt coord of obs + integer :: ril, rjl ! Mass-pt integer coord immed sw of obs integer :: iend, jend ! Upper i, j index for interpolation real :: dxob, dyob ! Grid fractions for interp logical :: llsave ! Save lat/lon values if true character(len=200) :: msg ! Argument to wrf_message - if(newpass) then ! No action on first pass - iref = n-1 + if(newpass) then newpass = .false. - else -! Start iteration only if we have not yet stored the 100th obs for printing. + nprev = nlast ! Reset in case old obs have been discarded from prev window + endif + +! Start iteration only if we have not yet stored prt_max number of obs for printing. ! Note: The loop below could represent multiple levels in a sounding, so we -! go ahead and start the loop if the beginning index (ndx) is 100 or -! less, and then exit the loop if ndx exceeds 100. +! go ahead and start the loop if the beginning index (ndx) is prt_max or +! less, and then exit the loop if ndx exceeds prt_max. if(prt_freq.gt.0) then - ndx = (nprev-1-iref)/prt_freq + 1 + ndx = (n-nlast-1)/prt_freq + 1 + ndxp = (nprev-nlast-1)/prt_freq + 1 else write(msg,*) 'STOP! OBS NAMELIST INPUT obs_prt_freq MUST BE GREATER THAN ZERO.' call wrf_message(msg) @@ -1782,12 +1760,18 @@ SUBROUTINE collect_obs_info(newpass,inest,n,latitude,longitude,nprev,niobf, & call wrf_error_fatal ( 'wrf_fddaobs_in: in4dob STOP' ) endif - if(ndx .le. prt_max) then +! write(6,'5(a,i5),a,a15') 'n = ',n,' nlast = ',nlast,' ndx = ',ndx, & +! ' nprev = ',nprev,' ndxp = ',ndxp, & +! ' station id = ',station_id + + if(ndxp .lt. prt_max) then - MODCHK : do nn = nprev, n-1 + MODCHK : do nn = nprev+1, n llsave = .false. - if( mod(nn-1,prt_freq) .eq. 0 ) then - ndx = (nn-1-iref)/prt_freq + 1 + +! if( mod(nn-1,prt_freq) .eq. 0 ) then + if( mod(nn-nlast-1,prt_freq) .eq. 0 ) then + ndx = (nn-nlast-1)/prt_freq + 1 if(ndx.gt.prt_max) EXIT MODCHK ! Limit printout to prt_max entries llsave = .true. endif @@ -1795,117 +1779,28 @@ SUBROUTINE collect_obs_info(newpass,inest,n,latitude,longitude,nprev,niobf, & ! Collect obs index and latitude and longitude. obs(ndx) = nn - lat(ndx) = plat - lon(ndx) = plon + lat(ndx) = latitude + lon(ndx) = longitude + +! Collect first 15 chars of obs station id (in integer format). + do i = 1,15 + stnid(i,ndx) = ichar(station_id(i:i)) + enddo ! Compute and collect the model latitude and longitude at the obs point. CALL get_model_latlon(nn,niobf,rio,rjo,xlat,xlong,e_we,e_sn, & ims,ime,jms,jme,its,ite,jts,jte, & mlat(ndx),mlon(ndx)) - endif !end if(llsave) enddo MODCHK - endif !end if(nprev/prt_freq+1) .le. prt_max) - - endif ! end if(.not. newpass) + endif !end if(ndx .le. prt_max) ! Save index of previous obs in read loop. - nprev = n - plat = latitude - plon = longitude + nprev = n END SUBROUTINE collect_obs_info - SUBROUTINE finish_obs_info(iprt,nstaw,niobf,rio,rjo,prt_max,prt_freq, & - xlat,xlong,e_we,e_sn,iref,obs,lat,lon, & - mlat,mlon,plat,plon,xtime, & - ims,ime,jms,jme,its,ite,jts,jte) -!************************************************************************* -! Purpose: Finish collecting obs information, according to prt_freq, but -! limit to prt_max obs. Because latitude and longitude informa- -! tion was collected (with subroutine collect_obs_info) within -! the OBS READ LOOP, where lat&lon for obs N is collected on -! pass N+1, there could be one more obs whose lat&lon info needs -! to be collected (for printing). Note that in subroutine -! collect_obs_info, the obs lat&lon values for the currently read -! obs was stored into plat&plon for just this purpose. -!************************************************************************* - - IMPLICIT NONE - - LOGICAL, intent(in) :: iprt ! Print flag - INTEGER, intent(in) :: nstaw ! Number of observations - INTEGER, intent(in) :: niobf ! Maximum number of observations - REAL, intent(in) :: rio(niobf) ! West-east coord (non-stagger) - REAL, intent(in) :: rjo(niobf) ! South-north coord (non-stagger) - INTEGER, intent(in) :: prt_max ! Max no. of obs for diagnostic printout - INTEGER, intent(in) :: prt_freq ! Frequency for diagnostic printout - REAL, DIMENSION( ims:ime, jms:jme ), & - intent(in) :: xlat, xlong ! Lat/lon on mass-pt grid - INTEGER, intent(in) :: e_we ! Max grid index in south-north - INTEGER, intent(in) :: e_sn ! Max grid index in west-east - INTEGER, intent(in) :: iref ! Reference obs index - INTEGER, intent(inout) :: obs(prt_max) ! Saved obs indices to print - REAL, intent(inout) :: lat(prt_max) ! Saved latitudes - REAL, intent(inout) :: lon(prt_max) ! Saved longitudes - REAL, intent(inout) :: mlat(prt_max) ! Saved model latitudes - REAL, intent(inout) :: mlon(prt_max) ! Saved longitudes - REAL, intent(in) :: plat ! Previous latitude read - REAL, intent(in) :: plon ! Previous longitude read - REAL, intent(in) :: xtime ! Model time in minutes - INTEGER, intent(in) :: ims ! Grid mem start (west-east) - INTEGER, intent(in) :: ime ! Grid mem end (west-east) - INTEGER, intent(in) :: jms ! Grid mem start (south-north) - INTEGER, intent(in) :: jme ! Grid mem end (south-north) - INTEGER, intent(in) :: its ! Grid tile start (west-east) - INTEGER, intent(in) :: ite ! Grid tile end (west-east) - INTEGER, intent(in) :: jts ! Grid tile start (south-north) - INTEGER, intent(in) :: jte ! Grid tile end (south-north) - -! Local variables - integer :: n ! Loop counter over obs - integer :: lastobs ! Last obs collected for printout - integer :: lastn ! Value of n for last obs(n) entry - integer :: igap ! Gap between last obs read and last saved - integer :: ndx ! Index into printout arrays - integer :: iobs ! Obs gap indices between lastobs and nstaw - -! Find the last obs index whose lat&lon info was collected. - lastobs = 0 - lastn = 0 - do n=1,prt_max - if(obs(n).ne.-999) then - lastobs = obs(n) - lastn = n - endif - enddo - -! There could be more obs to collect. - - if(lastn.gt.0) then ! Do only if at least 1 obs was collected. - igap = (nstaw-lastobs)/prt_freq - - do n = 1, igap - ndx = lastn + n - - iobs = lastobs + n*prt_freq - if(ndx.le.prt_max) then - -! Compute and collect model lat&lon at obs point. - CALL get_model_latlon(iobs,niobf,rio,rjo,xlat,xlong,e_we,e_sn, & - ims,ime,jms,jme,its,ite,jts,jte, & - mlat(ndx),mlon(ndx)) - -! Collect obs index and lat&lon. - obs(ndx) = iobs - lat(ndx) = plat - lon(ndx) = plon - endif - enddo - endif - END SUBROUTINE finish_obs_info - SUBROUTINE get_model_latlon(n,niobf,rio,rjo,xlat,xlong,e_we,e_sn, & ims,ime,jms,jme,its,ite,jts,jte, & mlat,mlon) diff --git a/test/em_fire/input_sounding b/test/em_fire/input_sounding deleted file mode 100644 index 0f91581b8a..0000000000 --- a/test/em_fire/input_sounding +++ /dev/null @@ -1,48 +0,0 @@ - 1000.00 300.00 14.00 - 250.00 300.45 14.00 -7.88 -3.58 - 750.00 301.25 14.00 -6.94 -0.89 - 1250.00 302.47 13.50 -5.17 1.33 - 1750.00 303.93 11.10 -2.76 2.84 - 2250.00 305.31 9.06 0.01 3.47 - 2750.00 306.81 7.36 2.87 3.49 - 3250.00 308.46 5.95 5.73 3.49 - 3750.00 310.03 4.78 8.58 3.49 - 4250.00 311.74 3.82 11.44 3.49 - 4750.00 313.48 3.01 14.30 3.49 - 5250.00 315.24 2.36 17.15 3.49 - 5750.00 317.18 1.80 20.01 3.49 - 6250.00 319.02 1.41 22.87 3.49 - 6750.00 320.88 1.07 25.73 3.49 - 7250.00 322.80 0.80 27.15 3.49 - 7750.00 324.87 0.60 27.15 3.49 - 8250.00 326.86 0.43 27.15 3.49 - 8750.00 328.89 0.32 27.15 3.49 - 9250.00 330.39 0.24 27.15 3.49 - 9750.00 332.80 0.17 27.15 3.49 - 10250.00 335.23 0.10 27.15 3.49 - 10750.00 337.31 0.08 27.15 3.49 - 11250.00 339.55 0.05 27.15 3.49 - 11750.00 342.82 0.03 27.15 3.49 - 12250.00 349.88 0.04 27.15 3.49 - 12750.00 357.34 0.04 27.15 3.49 - 13250.00 364.91 0.04 27.15 3.49 - 13750.00 373.22 0.04 27.15 3.49 - 14250.00 381.67 0.04 27.15 3.49 - 14750.00 390.29 0.04 27.15 3.49 - 15250.00 398.91 0.04 27.15 3.49 - 15750.00 407.53 0.04 27.15 3.49 - 16250.00 416.15 0.04 27.15 3.49 - 16750.00 424.77 0.04 27.15 3.49 - 17250.00 433.39 0.04 27.15 3.49 - 17750.00 442.01 0.04 27.15 3.49 - 18250.00 450.63 0.04 27.15 3.49 - 18750.00 459.25 0.04 27.15 3.49 - 19250.00 467.87 0.04 27.15 3.49 - 19750.00 476.49 0.04 27.15 3.49 - 20250.00 485.11 0.04 27.15 3.49 - 20750.00 493.73 0.04 27.15 3.49 - 21250.00 502.35 0.04 27.15 3.49 - 21750.00 510.97 0.04 27.15 3.49 - 22250.00 519.59 0.04 27.15 3.49 - 22750.00 528.21 0.04 27.15 3.49 - diff --git a/test/em_fire/namelist.input b/test/em_fire/namelist.input deleted file mode 100644 index a1d73f0232..0000000000 --- a/test/em_fire/namelist.input +++ /dev/null @@ -1,183 +0,0 @@ - &time_control - run_days = 0, - run_hours = 0, - run_minutes = 20, - run_seconds = 0, - start_year = 0001, 0001, 0001, - start_month = 01, 01, 01, - start_day = 01, 01, 01, - start_hour = 00, 00, 00, - start_minute = 00, 00, 00, - start_second = 00, 00, 00, - end_year = 0001, 0001, 0001, - end_month = 01, 01, 01, - end_day = 01, 01, 01, - end_hour = 00, 00, 00, - end_minute = 600, 600, 600, - end_second = 00, 00, 00, - history_interval = 5, 30, 30, - frames_per_outfile = 1000, 1000, 1000, - restart = .false., - restart_interval = 1 - io_form_history = 2 - io_form_restart = 2 - io_form_input = 2 - io_form_boundary = 2 - debug_level = 101 - / - - &domains - time_step = 0, - !time_step = 5, - time_step_fract_num = 25, - time_step_fract_den = 100, - max_dom = 1, - s_we = 1, 1, 1, - e_we = 42, 43, 43, - s_sn = 1, 1, 1, - e_sn = 42, 43, 43, - s_vert = 1, 1, 1, - e_vert = 41, 41, 41, - dx = 60, 30, 10, - dy = 60, 30, 10, - ztop = 1500, 1500, 1500, - grid_id = 1, 2, 3, - parent_id = 0, 1, 2, - i_parent_start = 0, 1, 1, - j_parent_start = 0, 1, 1, - parent_grid_ratio = 1, 2, 3, - parent_time_step_ratio = 1, 2, 3, - feedback = 1, - smooth_option = 0 - sr_x = 10, 0, 0 - sr_y = 10, 0, 0 - / - sr_x = 20, 0, 0 - sr_y = 20, 0, 0 - - &physics - mp_physics = 0, 0, 0, - ra_lw_physics = 0, 0, 0, - ra_sw_physics = 0, 0, 0, - radt = 30, 30, 30, - sf_sfclay_physics = 0, 0, 0, - sf_surface_physics = 0, 0, 0, - bl_pbl_physics = 0, 0, 0, - bldt = 0, 0, 0, - cu_physics = 0, 0, 0, - cudt = 0, 0, 0, - isfflx = 1, - ifsnow = 0, - icloud = 0, - num_soil_layers = 5, - mp_zero_out = 0, - / - - &fdda - / - - &dynamics - rk_ord = 3, - diff_opt = 2, - km_opt = 2, - damp_opt = 0, - zdamp = 5000., 5000., 5000., - dampcoef = 0.2, 0.2, 0.2 - khdif = 0.05, 0.05, 0.05, - kvdif = 0.05, 0.05, 0.05, - smdiv = 0.1, 0.1, 0.1, - emdiv = 0.01, 0.01, 0.01, - epssm = 0.1, 0.1, 0.1 - mix_full_fields = .true., .true., .true., - non_hydrostatic = .true., .true., .true., - h_mom_adv_order = 5, 5, 5, - v_mom_adv_order = 3, 3, 3, - h_sca_adv_order = 5, 5, 5, - v_sca_adv_order = 3, 3, 3, - time_step_sound = 20, 20, 20, - pd_moist = .false., .false., .false., - pd_scalar = .false., .false., .false., - pd_chem = .false., .false., .false., - pd_tke = .false., .false., .false., - / - - &bdy_control - periodic_x = .false.,.false.,.false., - symmetric_xs = .false.,.false.,.false., - symmetric_xe = .false.,.false.,.false., - open_xs = .true., .false.,.false., - open_xe = .true., .false.,.false., - periodic_y = .false.,.false.,.false., - symmetric_ys = .false.,.false.,.false., - symmetric_ye = .false.,.false.,.false., - open_ys = .true., .false.,.false., - open_ye = .true., .false.,.false., - nested = .false., .true., .true., - / - - &grib2 - / - - &namelist_quilt - nio_tasks_per_group = 0, - nio_groups = 1, - / - - &fire ! be sure to set sr_x,sr_y in domains-namelist (to set refinement in x,y) - ifire = 2, ! integer, = 0: no fire, 1= CAWFE 2=SFIRE -! variables for CAWFE (note: cawfe not maintained in this version, though) -! ignition for cawfe -!fire_lat_init = 40., ! real , initial fire latitude (deg) -!fire_lon_init = -105., ! real , initial fire longitude (deg) - fire_lat_init = 6.75e-3, ! real , initial fire latitude (deg) - fire_lon_init = 6.70e-3, ! real , initial fire longitude (deg) - fire_ign_time = 30., ! real , time of fire ignition (s) - fire_shape = 1, ! integer, initial fire shape - fire_sprd_mdl = 1, ! integer, = 0: Macarthur, = 1: BEHAVE - fire_crwn_hgt = 15., ! real , height of canopy crown (m) - fire_ext_grnd = 50., ! real , extinction coeff ground fire - fire_ext_crwn = 50., ! real , extinction coeff crown fire - fire_fuel_read = 0, ! integer, 0= use fire_fuel_cat, 1= by altitude 2= read from file - fire_fuel_cat = 3, ! integer, if specified which fuel category? -! -! variables for SFIRE -! -! ignition - fire_num_ignitions = 3, ! integer, only the first fire_num_ignition used, up to 5 allowed - fire_ignition_start_x1 = 1000, ! start points of ignition lines, in m from lower left corner - fire_ignition_start_y1 = 500, ! start points of ignition lines, in m from lower left corner - fire_ignition_end_x1 = 1000, ! end points of ignition lines, in m from lower left corner - fire_ignition_end_y1 = 1900, ! end points of ignition lines, in m from lower left corner - fire_ignition_radius1 = 18, ! all within this radius will ignite, > fire mesh step - fire_ignition_time1 = 2, ! sec for ignition from the start - fire_ignition_start_x2 = 1500, ! start points of ignition lines, in m from lower left corner - fire_ignition_start_y2 = 500, ! start points of ignition lines, in m from lower left corner - fire_ignition_end_x2 = 1500, ! end points of ignition lines, in m from lower left corner - fire_ignition_end_y2 = 1900, ! end points of ignition lines, in m from lower left corner - fire_ignition_radius2 = 18, ! all within this radius will ignite, > fire mesh step - fire_ignition_time2 = 3, ! sec for ignition from the start! end ignition for sfire - fire_ignition_start_x3 = 1400, ! start points of ignition lines, in m from lower left corner - fire_ignition_start_y3 = 1400, ! start points of ignition lines, in m from lower left corner - fire_ignition_end_x3 = 1400, ! end points of ignition lines, in m from lower left corner - fire_ignition_end_y3 = 1400, ! end points of ignition lines, in m from lower left corner - fire_ignition_radius3 = 50, ! all within this radius will ignite, > fire mesh step - fire_ignition_time3 = 4, ! sec for ignition from the start! end ignition for sfire -! -! verbosity - fire_print_msg = 1, ! 1 print fire debugging messages - fire_print_file = 0, ! 1 write files for matlab -! -! method selections, do not change from defaults unless you know what you are doing - fire_boundary_guard = -1, ! integer, number of cells to stop when fire close to the domain boundary, -1 turn off - fire_fuel_left_irl=2, ! refinement to integrate fuel_left, must be even - fire_fuel_left_jrl=2, ! refinement to integrate fuel_left, must be even - fire_atm_feedback=1.0, ! real, multiplier for heat fluxes, 1.=normal, 0.=turn off two-way coupling - fire_back_weight=0.5, ! RK timestepping coefficient, 0=forward, 0.5=Heun - fire_grows_only=1, ! if >0 level set function cannot increase = fire can only grow - fire_viscosity=0.4, ! artificial viscosity in level set method (max 1, needed with fire_upwinding=0) - fire_upwinding=3, ! 0=none, 1=standard, 2=godunov, 3=eno, 4=sethian - fire_fuel_left_method=1, ! for now, use 1 only - fire_lfn_ext_up=1.0, ! 0.=extend level set function at boundary by reflection, 1.=always up - fire_test_steps=0, ! >0 = on first call, do specified number of steps and terminate (testing only) - fire_topo_from_atm=1, ! 0 = expect fire mesh topo set correctly on entry, 1 = populate by interpolating from atmosphere -/