In a previous post I outlined how I set up CESM in aqua-planet mode with a specified sea surface temperature (SST) distribution. However, there are a few drawbacks to using prescribed SST. The biggest caveat is that fixed surface temperature can effectively be an infinite source of energy. I saw a poster a at a meeting last year that compared a simulation with prescribed SST to another with a slab ocean model (SOM) and the results were very striking, so I started thinking that I need to explore this type of modelling more. Below are my notes for setting up a aqua-planet slab-ocean configuration in CESM 1.2 on the Yellowstone machine (Linux) with the intel compiler.
A SOM is thermodynamically passive so it does not have any dynamics (i.e. the water doesn’t move around). A SOM is much cheaper and simpler to run compared to a full ocean model, but still reacts to things happening in the atmosphere, like changes in downwelling radiation or fluxes associated with surface wind. This allows for realistic estimates of climate sensitivity. The big drawback of a SOM is that there is no ocean circulation, which substantially contributes to the overall heat transport, especially in the Tropics. I couldn’t find a good article on the basics of SOM, but I did find this little description online:
“The slab mixed-layer ocean model assumes a fixed mixed-layer depth … The SST is determined by the energy balance between radiative flux at surface, latent and sensible heat fluxes and Q-flux, which crudely simulates the ocean transport.”
This “Q-flux” is the prescribed effect of ocean transport. Normally it is determined from observations, or a fully coupled model simulation, so that a SOM can be directly compared. In my case, I wanted an idealized configuration, so I made my own idealized Q-flux input (see below).
More CESM-specific details can be found in this white paper produced by scientists at NCAR.
I also found this FAQ article posted on the CESM forum that helped get me started.
The CESM has some “E” compsets that are setup to use the SOM, but in my case I wanted to get rid of all the land masses, so I needed to do a bit more work. Below I’ve outlined the procedure I used to set up a SOM aqua-planet simulation.
Creating the SOM input file
There is a subversion repository with code for creating input files from model output, but unfortunately, this is only useful for when you have output from a fully coupled run.
After creating the SOM input, we have to tell the model where to find it by modifying the docn.streams.txt file. For CESM 1.1, the file is found at $CASEROOT/CaseDocs/docn.streams.txt.som, but this file is write protected, so it’s better to make a copy renamed as user_docn.streams.txt in the case root directory and edit that. There are two instances each of <fileNames> and <filePath> that need to be edited, one for the domain file, and another for the data file (with the Q-flux, or qdp data).
Dealing with sea ice
In my original aqua-planet simulations I turned off sea ice completely, but from the forum FAQ page it seems like it is better to have prognostic sea ice. I’m not sure what consequence this will have when there are no continents… but I guess I will find out. On of the forum comments mentions how to initialize the CICE model:
“In the CICE namelist there is a variable called ice_ic. This is the file name from where the initial ice state variables are set. If ice_ic = ‘default’, this means it sets it to a uniform ice cover wherever it is “cold”. If ice_ic = ‘none’ it is initialized with no ice at all.”
Creating an idealized Q-Flux
Below is an excerpt from the NCL code I used to make an idealized Q-flux field using an error function for the latitudinal shape. The whole file can be found in one of my public BitBucket repositories with various code for running CESM. It’s kind of a mess but the excerpt below comes from MODEL-CESM/IC_code/mk.asom.sst.v1.ncl
sst_clat = 0 ; Latitude of warmest SST y = (lat-sst_clat)/max(lat) yc = 2. shape = exp(-1.*(1.5*y)^8.) + exp(-1.*(6.*y)^2.) shape = shape / max(shape) iqdp = shape *(70+4.)-4. qdp = conform(SST, iqdp ,1) ; S is the SST field qdp@long_name = "ocean heat flux"
Some Errors I Came Across
At some point in the setup I ran into this error in the ocn component run log:
(shr_stream_findBounds) ERROR: LVD not found, all data is before yearFirst (shr_sys_abort) ERROR: (shr_stream_findBounds) ERROR: LVD not found, all data is before yearFirst (shr_sys_abort) WARNING: calling shr_mpi_abort() and stopping
I found this post talking about a similar error, but in the data atmosphere model. In my case the fix involved making sure the ocean model “streams” file ( $CASEROOT/CaseDocs/docn.streams.txt ) was copied to $CASEROOT/user_docn.streams.txt.som correctly and edited so that it pointed to the correct input files. Forgetting the extra “.som” at the end of the filename was part of the problem as well.
My initial tests of this whole thing used an idealized Q-flux input that was a smoothed and latitudinally symmetric version of observations. I was surprised by how much adjustment there was though. After a 4 year run it was evident that I needed a lot more time to stabilize the SST field. Below is a figure showing one of the more mild adjustment patterns as a function of latitude.