Welcome to the new DiscussCESM forum!
We are still working on the website migration, so you may experience downtime during this process.

Existing users, please reset your password before logging in here: https://xenforo.cgd.ucar.edu/cesm/index.php?lost-password/

Synthetic volcanic eruptions


Eirik Enger
New Member

I am aiming to run the CESM2.1.3 using synthetic volcanoes, i.e., I want to be able to have full control of when, where, how large, etc. the volcanic eruptions are.
I found in particular three type of files of interest in the input directory:
- emissions-cmip6_num_a1_so4_contvolcano_vertical_850-5000_1.9x2.5_c20190417.nc
- VolcanEESMv3.10_piControl_SO2_1850-2014average_1deg_ZeroTrop_c180416.nc
- volc_camRRTMG_byradius_sigma1.2_mode3_c170214.nc
with similar versions for all three.

My initial idea was that the file that control the eruptive volcanoes was VolcanEESMv3.10_piControl_SO2_1850-2014average_1deg_ZeroTrop_c180416.nc, and that I only need to replace this with my own.
I saw in the description of the file that it was created using a script found at p/codescripts/code - Revision 1627: /trunk/ncl/emission.
Am I correct in assuming that I can use this script to produce my own version of VolcanEESMv3.10_piControl_SO2_1850-2014average_1deg_ZeroTrop_c180416.nc, and that this is all that is needed?

Assuming all the needed input files exist in the correct location (i.e., assuming the above is correct), how should the model be told it should use the new custom files?
Will this have to be given in user_nl_cam as a namelist parameter?



CSEG and Liaisons
Staff member
CESM2 has several different configurations for its atmosphere component, which deal with eruptive volcanoes differently:
  • CAM is the low-top atmosphere with very limited chemistry, and a model top near 45 km. The chemistry in CAM is sufficient only for prognostic sulfate and secondary organic aerosols in the troposphere. It is not sufficient to calculate the evolution of stratospheric aerosols from source gases, such as SO2 in large volcanic eruptions. This is because the chemistry lacks interactive hydroxyl (OH). Therefore, stratospheric aerosols are prescribed in CAM based output from previous WACCM simulations.
  • WACCM is the high-top atmosphere, whose domain goes from the surface to ~145 km. Standard WACCM includes fully interactive chemistry of two levels of complexity. TSMLT1 is the most complete chemistry, capable of treating complex reactions in the troposphere, as well as the stratosphere, mesosphere, and lower thermosphere. Middle atmosphere (MA) chemistry is a less expensive version, lacking only the complex tropospheric chemistry. Both of these chemistry packages are capable of calculating the evolution of stratospheric aerosol from SO2 emissions from large volcanic eruptions. CESM2.1.3 supports running WACCM with TSMLT1 at 0.95° latitude x 1.25° longitude (1deg), and WACCM with MA at 1.9° latitude x 2.5° longitude (2deg).
  • CAM-chem is a version of the low-top CAM that includes fully interactive chemistry. This supports calculating the evolution of stratospheric aerosol from SO2 emissions from large volcanic eruptions, although the stratospheric dynamics differ from WACCM due to the lower model top.
  • There is also a version of WACCM without interactive chemistry, called SC-WACCM. This uses prescribed stratospheric aerosols, like CAM.
You want to run WACCM or CAM-chem with SO2 emitted by volcanic eruptions by using an SO2 external forcing file, such as the one you have found starting with VolcanEESM. The one you have found is not for episodic eruptions, but represents an average of eruptions over the historical period (1850-2014) for use in pre-industrial control (piControl) simulations for CMIP6. There are different SO2 external forcing files for transient historical simulations. These have been created specifically for 1deg and 2deg simulations, and can be found here:

As you will see in the metadata, these are created with different NCL scripts than the piControl file that you found. But they can be found at that same subversion repository. There are also scripts there for creating emissions files for single eruptions.

You can see how these files are implemented in the atm_in namelist if you create a WACCM historical case, using one of the following supported configurations:
  • BWHIST at f09_g17 resolution: TSMLT1 chemistry, 1deg atmosphere, coupled ocean
  • FWHIST at f09_f09 resolution: TSMLT1 chemistry, 1deg atmosphere, data ocean
  • BWmaHIST at f19_g17 resolution: MA chemistry, 2deg atmosphere, coupled ocean
  • FWmaHIST at f19_f19 resolution: MA chemistry, 2deg atmosphere, data ocean
The SO2 file appears in the atm_in namelist under the ext_frc_specifier, which can be modified using a user_nl_cam file in your case directory.

You also mentioned other input data files you found that reference volcanoes.

Those with "contvolcano" in their name refer to surface emissions from continuously outgassing volcanoes. These do not vary with time in our simulations, but could be modified or supplemented with additional surface emissions.

The volc_camRRTMG_byradius files contain optical properties for aerosols that are either prognostic or prescribed.

If you let me know more specifically what type of simulations you are planning, I can probably help you better. Do you want transient volcanoes in a pre-industrial atmosphere? Do you want coupled ocean simulations, or data ocean?

Are you interested in running WACCM? The cost of the 2deg WACCM-MA configuration is about 10 times less than the standard 1deg WACCM-TSMLT version.


Eirik Enger
New Member
Hi, thank you for the detailed response.

From the four configurations I believe the BWmaHIST would be preferable at least for now, i.e. I want coupled ocean, but data ocean could also be interesting later on to be able to look at the forcing. Also, I understand WACCM is better at representing the aerosols(?). (I tried creating a new case with the BWmaHIST config and see the new VolcanEESM... was now downloaded to the input directory.)

Just to be clear, is it necessary to specify (in user_nl_cam) the complete list of the specifier ext_frc_specifier if only one file is changed (VolcanEESM...)? That is, setting all

ext_frc_specifier = 'bc_a4 -> /path/to/file.nc',
'NO2 -> ...',
'so4_a2 -> ...'

vs just
SO2 -> /path/to/VolcanEESM...

Answering your other questions:
The simulations I'm planning are to represent volcanoes using a 1D array (either historical data or as a train of pulses with for example exponential decay) in pre-industrial conditions. I believe this is where I should use an appropriate NCL file to create a properly formatted forcing file. The simulations should then be run for millennial length.



CSEG and Liaisons
Staff member
Yes, you need to copy the entire ext_frc_specifier with all of the species into your user_nl_cam, even if you are only modifying the volcanic eruption SO2 file.

Since you want to run at constant pre-industrial conditions, you should start from a BWma1850 compset at f19_g17 resolution. Then replace the VolcanEESM averaged eruption file with one containing the episodic eruptions you want. By default, this compset starts running at year 1, so keep this in mind when creating dates for your eruptions. You can also modify the RUN_STARTDATE with the xmlchange command, i.e.

./xmlchange RUN_STARTDATE=1700-01-01

You can check the current setting with:

./xmlquery RUN_STARTDATE


Eirik Enger
New Member
For a little while now I have been trying to run the CESM2 with a forcing file generated from this (http://svn.code.sf.net/p/codescripts/code/trunk/ncl/emission/createVolcEruptV3.1piControl.ncl) script. When I inspect the variables in the generated file I am able to confirm that volcanic events were generated in the years 1850 and 1858, just as expected.

The compset I use is the BWma1850 at f19_g17 resolution, with one change in 'user_nl_cam':

ext_frc_specifier              = 'bc_a4 -> /cluster/projects/nn9348k/cesm/input-data/atm/cam/chem/emis/CMIP6_emissions_1750_2015_2deg/emissions-cmip6_bc_a4_aircraft_vertical_1750-2015_1.9x2.5_c20170608.nc',
         'NO2 -> /cluster/projects/nn9348k/cesm/input-data/atm/cam/chem/emis/CMIP6_emissions_1750_2015_2deg/emissions-cmip6_NO2_aircraft_vertical_1750-2015_1.9x2.5_c20170608.nc',
         'num_a1 -> /cluster/projects/nn9348k/cesm/input-data/atm/cam/chem/emis/CMIP6_emissions_1750_2015_2deg/emissions-cmip6_num_so4_a1_anthro-ene_vertical_1750-2015_1.9x2.5_c20170616.nc',
         'num_a1 -> /cluster/projects/nn9348k/cesm/input-data/atm/cam/chem/emis/CMIP6_emissions_1750_2015_2deg/emissions-cmip6_num_a1_so4_contvolcano_vertical_850-5000_1.9x2.5_c20190417.nc',
         'num_a2 -> /cluster/projects/nn9348k/cesm/input-data/atm/cam/chem/emis/CMIP6_emissions_1750_2015_2deg/emissions-cmip6_num_a2_so4_contvolcano_vertical_850-5000_1.9x2.5_c20190417.nc',
         'num_a4 -> /cluster/projects/nn9348k/cesm/input-data/atm/cam/chem/emis/CMIP6_emissions_1750_2015_2deg/emissions-cmip6_num_bc_a4_aircraft_vertical_1750-2015_1.9x2.5_c20170608.nc',
         'SO2 -> /cluster/projects/nn9348k/cesm/input-data/atm/cam/chem/emis/CMIP6_emissions_1750_2015_2deg/emissions-cmip6_SO2_aircraft_vertical_1750-2015_1.9x2.5_c20170608.nc',
         'SO2 -> /cluster/projects/nn9348k/cesm/input-data/atm/cam/chem/emis/CMIP6_emissions_1750_2015_2deg/emissions-cmip6_SO2_contvolcano_vertical_850-5000_1.9x2.5_c20190417.nc',
         'SO2 -> /cluster/home/een023/working_forcing_files/VolcanEESMvEnger_piControl_SO2_1850-2014average_2deg_c20210713.nc',
         'so4_a1 -> /cluster/projects/nn9348k/cesm/input-data/atm/cam/chem/emis/CMIP6_emissions_1750_2015_2deg/emissions-cmip6_so4_a1_anthro-ene_vertical_1750-2015_1.9x2.5_c20170616.nc',
         'so4_a1 -> /cluster/projects/nn9348k/cesm/input-data/atm/cam/chem/emis/CMIP6_emissions_1750_2015_2deg/emissions-cmip6_so4_a1_contvolcano_vertical_850-5000_1.9x2.5_c20190417.nc',
         'so4_a2 -> /cluster/projects/nn9348k/cesm/input-data/atm/cam/chem/emis/CMIP6_emissions_1750_2015_2deg/emissions-cmip6_so4_a2_contvolcano_vertical_850-5000_1.9x2.5_c20190417.nc'

I.e., the only line I change is the last instance of 'SO2 -> /cluster/home/...'. I further change RUN_STARTDATE to
./xmlchange RUN_STARTDATE=1850-01-01

Both the build and model run finishes successfully, but in the output files there are no signs of the custom volcanoes in the forcing file I added, so it seems it does not read the forcing file at all, or that the time is incorrect in some way.
NOTE: A more detailed description of how I generate the forcing file can be found here: GitHub - engeir/volcano-cooking: Make some volcanoes to simulate in CESM2

If the goal is to run CESM2 in pre-industrial conditions with custom volcanoes happening at arbitrary times between, say, 1850 and 2010, does this approach seem to be correct? And if so, do you see an obvious reason why the volcanoes is not included in the model simulation and hence do not affect the temperature output at all?