Scheduled Downtime
On Friday 21 April 2023 @ 5pm MT, this website will be down for maintenance and expected to return online the morning of 24 April 2023 at the latest

Problems with long-time simulations of wrf-chem

This post was from a previous version of the WRF&MPAS-A Support Forum. New replies have been disabled and if you have follow up questions related to this post, then please start a new thread from the forum home page.

wangzheng

New member
I want to investigate how the dust direct radiative effect affects the climate of east Asia. The control test is the one without dust direct radiative effect. There are two ways to design the control test, but two designs have different results. The first way is to set dust concentration to 0 in chem/optical_driver.F, shown below
Code:
do mm = p_dust_1, p_dust_5
  chem(:,:,:,mm) = 1.e-16 ! initial minimum value for chem
end do
call optical_averaging(...)
The other way is setting dust_opt=0 in namelist.input without changing code. The bias exists even if dust_opt=0 in the first test. The surface temperature bias can be as large as 10 degrees after long-time running.

This is my namelist.input
Code:
&time_control            
run_days                 = 107,
run_hours                = 0,
run_minutes              = 0,
run_seconds              = 0,
start_year               = 2001,
start_month              = 05,
start_day                = 17,
start_hour               = 00,
start_minute             = 00,
start_second             = 00,
end_year                 = 2001,
end_month                = 09,
end_day                  = 01,
end_hour                 = 00,
end_minute               = 00,
end_second               = 00,
interval_seconds         = 21600,
input_from_file          = .true.,
history_interval         = 43200,
frames_per_outfile       = 1000,
restart                  = .false.,
restart_interval         = 43200,
io_form_history          = 2,
io_form_restart          = 2,
io_form_input            = 2,
io_form_boundary         = 2,
iofields_filename        = "myoutfields.txt",
auxhist24_outname        = "auxhist24_d<domain>.nc",
io_form_auxhist24        = 2,
auxhist24_interval       = 360,
frames_per_auxhist24     = 2000,
auxinput4_inname         = "wrflowinp_d<domain>",
auxinput4_interval       = 360,
io_form_auxinput4        = 2,
debug_level              = 0,
/

&domains                 
time_step                = 200,
time_step_fract_num      = 0,
time_step_fract_den      = 1,
max_dom                  = 1,
e_we                     = 188,
e_sn                     = 140,
e_vert                   = 35,
p_top_requested          = 5000,
num_metgrid_levels       = 27,
num_metgrid_soil_levels  = 2,
dx                       = 36000,
dy                       = 36000,
grid_id                  = 1,
parent_id                = 1,
i_parent_start           = 1,
j_parent_start           = 1,
parent_grid_ratio        = 1,
parent_time_step_ratio   = 1,
feedback                 = 1,
smooth_option            = 0,
sfcp_to_sfcp             = .true.,
/

&physics                 
mp_physics               = 2,
mp_zero_out              = 2,
ra_lw_physics            = 4,
ra_sw_physics            = 4,
radt                     = 36,
sf_sfclay_physics        = 1,
sf_surface_physics       = 4,
bl_pbl_physics           = 1,
bldt                     = 0,
topo_wind                = 1,
cu_physics               = 5,
cudt                     = 0,
cu_diag                  = 1,
cu_rad_feedback          = .true.,
cugd_avedx               = 1,
isfflx                   = 1,
ifsnow                   = 0,
icloud                   = 1,
surface_input_source     = 1,
num_soil_layers          = 4,
sf_urban_physics         = 0,
maxiens                  = 1,
maxens                   = 3,
maxens2                  = 3,
maxens3                  = 16,
ensdim                   = 144,
sst_update               = 1,
tmn_update               = 1,
sst_skin                 = 1,
/

&fdda                    
grid_fdda                = 0,
/

&dynamics                
w_damping                = 1,
diff_opt                 = 1,
km_opt                   = 4,
diff_6th_opt             = 0,
diff_6th_factor          = 0.12,
base_temp                = 290.,
damp_opt                 = 3,
zdamp                    = 5000.,
dampcoef                 = 0.2,
khdif                    = 0,
kvdif                    = 0,
non_hydrostatic          = .true.,
chem_adv_opt             = 2,
moist_adv_opt            = 2,
scalar_adv_opt           = 2,
tke_adv_opt              = 2,
/

&bdy_control             
spec_bdy_width           = 10,
spec_zone                = 1,
relax_zone               = 9,
spec_exp                 = 0.33,
specified                = .true.,
nested                   = .false.,
/

&grib2                   
/

&namelist_quilt          
nio_tasks_per_group      = 0,
nio_groups               = 1,
/

&chem
chem_opt                 = 300,
chemdt                   = 10,
chem_in_opt              = 0,
kemit                    = 1,
io_style_emissions       = 2,
emiss_inpt_opt           = 1,
emiss_opt                = 0,
biomass_burn_opt         = 0,
plumerisefire_frq        = 30,
dmsemis_opt              = 1,
seas_opt                 = 1,
dust_opt                 = 0,
dust_schme               = 2,
dust_alpha               = 0.55,
dustwd_onoff             = 0,
bio_emiss_opt            = 0,
bioemdt                  = 30,
phot_opt                 = 0,
photdt                   = 30,
gas_drydep_opt           = 1,
aer_drydep_opt           = 1,
gas_bc_opt               = 1,
gas_ic_opt               = 1,
aer_bc_opt               = 1,
aer_ic_opt               = 1,
gaschem_onoff            = 1,
aerchem_onoff            = 1,
wetscav_onoff            = 0,
cldchem_onoff            = 0,
vertmix_onoff            = 1,
chem_conv_tr             = 1,
aer_ra_feedback          = 1,
aer_op_opt               = 1,
opt_pars_out             = 1,
have_bcs_chem            = .false.,
/
I guess that the bias is from the error of chem(dust), as without changing the code chem(dust) is actually 1.e-16~1.e-12(from boundary initialization). After long-time running, the error grows big. It's only my guess.
Is there any solution to constrain the bias of two control tests? Thanks.
 
Hi,

If I correctly understand the issue you are having (large differences between your two methods of setting dust tracers to 0), I believe this is due to a mismatch between the timing of the optical driver and radiation driver calls. The optical driver is not called at every time step, and so in your first method, the dust values are only reset when the optical driver is called. So unless the current timestep is a multiple of both radt and photdt, there will be dust in the array when it makes it to radiation. That said, I would recommend either modify your code so that dust is set to 1e-16 right before radiation is called (e.g., look for where the array "aero" in module_radiation_driver.F is set, Line 1277 in the version i checked) or stick with dust_opt=0. Hope this helps!

Cheers,

Jordan
 
Thanks for your suggestion. I have tested the two schemes by both setting dust_opt=0, and found the large difference. I am using RRTMG radiation scheme. RRTMG_SWRAD and RRTMG_LWRAD do not seem to use the variable "aero". I will start two new tests by both setting photdt=radt=36.
 
By both setting dust_opt=0 and photdt=radt=36, the two schemes (whether or not set chem(dust)=1e-16 in optical driver) still show large differences.
 
Hmm, see if you can save out the dust array at high-frequency to see when it clears. I see that you also have chemdt /= 0 - can you set this to 0? Another option might be to set chem(dust) in a location that you are sure will be called at every time step.
 
I finally solved the problem by using nested domain. In my opinion, the 2nd domain do not need boundary condition, so no 1.e-12 appears in the boundary and chem(dust) equals 1.e-16 in all grids, introducing no difference whether or not setting chem(dust)=1.e-16. Maybe it is only a problem about numerical instability.
 
Top