Restarting WRF with a different history interval

Dec 5, 2020

…or, how to change your history interval mid-run for WRF.

Here is a funny problem: I’m running a rather long WRF (or WRF-GC) case where I have to spin-up chemistry for about a month before I run the remaining time in the simulation.

The spin-up period history output is no use to me, but as a sanity check I want to output every 12 hours to see if things are going OK. Then for the main simulation period I want hourly output.

The reason I do this is because (1) storage is constrained and I don’t want to hog the server with useless output (and wake up in the middle of the night to delete useless data) and (2) core hours are constrained and I might get kicked out of the queue, so it’s better to do this in a few restart runs in WRF.

How can I do this? The logical thinking is to run the spin-up first with namelist.input option:

 history_interval                    = 720, 720, 720,
 frames_per_outfile                  = 1, 1, 1,
 restart                             = .false.,
 restart_interval                    = 10080,

The 10080 is number of minutes between restart files being written (24 x 7 x 60 = 10,080). Then once I am done with the spin-up, I can simply restart by killing the job, and modifying the namelist like so:

 history_interval                    = 60, 60, 60,
 frames_per_outfile                  = 1, 1, 1,
 restart                             = .true.,
 restart_interval                    = 10080,

Nope! This won’t work. Apparently, WRF stores the history alarm (WRF jargon for “when is history going to be written next?”) inside the wrfrst restart files generated. How do I know this?

Because I ran about a week into my simulation and realized I had no hourly output.

Oops! Let’s poke into wrfrst and see what we can find:

$ ncdump -h wrfrst_d01 > reset.txt
// global attributes:
                :TITLE = " OUTPUT FROM WRF V3.9.1.1 MODEL" ;
                :START_DATE = "2019-04-02_00:00:00" ;
                :SIMULATION_START_DATE = "2019-04-02_00:00:00" ;
                :MAX_WRF_ALARMS = 55 ;
                :WRF_ALARM_ISRINGING_01 = 0 ;
                :WRF_ALARM_SECS_TIL_NEXT_RING_01 = 43200 ;

Yes! 43200 just so happens to be 720 minutes (720 x 60 = 43,200 seconds) and checking the WRF source confirms this somewhat: 01 is the history alarm.

Can I do something sneaky and change history_interval in the restart file? Luckily, yes - it would be kind of stupid to re-run the whole spin-up because of a namelist issue. NCO to the rescue. Copy your restart files, prefix them with old_ for backup and do this for each domain:

ncatted -O -h -a WRF_ALARM_SECS_TIL_NEXT_RING_01,global,m,i,3600 old_wrfrst_d01_2019-04-30_00\:00\:00 wrfrst_d01_2019-04-30_00\:00\:00

The modifier m means modify the global attribute, i is integer, and 3600 is the desired history_interval in minutes.

All done! Core hours and storage are both saved by this little trick.