Part 1: Model E
I felt a bit over my head attempting to port CESM, so I asked a grad student, who had done his Master’s on climate modelling, for help. He looked at the documentation, scratched his head, and suggested I start with NASA’s Model E instead, because it was easier to install. And was it ever! We had it up and running within an hour or so. It was probably so much easier because Model E comes with gfortran support, while CESM only has scripts written for commercial compilers like Intel or PGI.
Strangely, when using Model E, no matter what dates the rundeck sets for the simulation start and end, the subsequently generated I file always has December 1, 1949 as the start date and December 2, 1949 as the end date. We edited the I files after they were created, which seemed to fix the problem, but it was still kind of weird.
I set up Model E to run a ten-year simulation with fixed atmospheric concentration (really, I just picked a rundeck at random) over the weekend. It took it about 3 days to complete, so just over 7 hours per year of simulation time…not bad for a 32-bit desktop!
However, I’m having some weird problems with the output – after configuring the model to output files in NetCDF format and opening them in Panoply, only the file with all the sea ice variables worked. All the others either gave a blank map (array full of N/A’s) or threw errors when Panoply tried to read them. Perhaps the model isn’t enjoying having the I file edited?
Part 2: CESM
The CESM code can be downloaded using Subversion (instructions here) after a quick registration. Using the Ubuntu Software Center, I downloaded some necessary packages:
torque-scheduler. I already had
gfortran, which is sort of essential.
I used the Porting via user defined machine files method to configure the model for my machine, using the Hadley scripts as a starting point. Variables for the config_machines.xml are explained in Appendix D through H of the user's guide (links in chapter 7). Mostly, you're just pointing to folders where you want to store data and files. Here are a few exceptions:
DOUT_L_HTAR: I stuck with
"TRUE", as that was the default.
CCSM_CPRNC: this tool already exists in the CESM source code, in
BATCHSUBMIT: the Hadley entry had "qstat" and "qsub", respectively, so I Googled these terms to find out which batch submission software they referred to (Torque, which is freely available in the
torque-schedulerpackage) and downloaded it so I could keep the commands the same!
GMAKE_J: this determines how many processors to commit to a certain task, and I wasn't sure how many this machine had, so I just put "1".
MAX_TASKS_PER_NODE: I chose
"8", which the user's guide had mentioned as an example.
MPISERIAL_SUPPORT: the default is "FALSE".
The only file that I really needed to edit was
Macros.<machine name>. The
env_machopts.<machine name> file ended up being empty for me. I spent a while confused by the
modules declarations, which turned out to refer to the Environment Modules software. Once I realized that, for this software to be helpful, I would have to write five or six modulefiles in a language I didn't know, I decided that it probably wasn't worth the effort, and took these declarations out. I left
mkbatch.<machine name> alone, except for the first line which sets the machine, and then turned my attention to Macros.
"Getting this to work will be an iterative process", the user's guide says, and it certainly was (and still is). It's never a good sign when the installation guide reminds you to be patient! Here is the sequence of each iteration:
- Edit the Macros file as best I can.
- Open up the terminal,
cesm1_0/scripts, and create a new case as follows:
./create_newcase -case test -res f19_g16 -compset X -mach <machine name>
- If this works,
test, and run configure:
- If all is well, try to build the case:
- See where it fails and read the build log file it refers to for ideas as to what went wrong. Search on Google for what certain errors mean. Do some other work for a while, to let the ideas simmer.
- Set up for the next case:
cd .., and
rm -rf test. This clears out old files so you can safely build a new case with the same name.
- See step 1.
I wasn't really sure what the program paths were, as I couldn't find a nicely contained folder for each one (like Windows has in "Program Files"), but I soon stumbled upon a nice little trick: look up the package on Ubuntu Package Manager, and click on "list of files" under the Download section. That should tell you what path the program used as its root.
I also discovered that setting
gcc, respectively, in the Macros file will throw errors. Instead, leave the variables as
mpicc, which are linked to the GNU compilers. For example, when I type
mpif90 in the terminal, the result is
gfortran: no input files, just as if I had typed
gfortran. For some reason, though, the errors go away.
As soon as I made it past building the mct and pio libraries, the build logs for each component (eg atm, ice) started saying
gmake: command not found. This is one of the pitfalls of Ubuntu: it uses the command
make for the same program that basically every other Unix-based OS calls
gmake. So I needed to find and edit all the scripts that called
gmake, or generated other scripts that called it, and so on. "There must be a way to automate this," I thought, and from this article I found out how. In the terminal, cd to the CESM source code folder, and type the following:
grep -lr -e 'gmake' * | xargs sed -i 's/gmake/make/g'
You should only have to do this once. It's case sensitive, so it will leave the xml variable
Then I turned my attention to compiler flags, which Steve chronicled quite well in his notes (see link above). I made most of the same changes that he did, except I didn't need to change
-DDarwin. However, I needed some more compiler flags still. In the terminal,
man gfortran brings up a list of all the options for gfortran, which was helpful.
The ccsm build log had hundreds of
undefined reference errors as soon as it started to compile fortran. The way I understand it, many of the fortran files reference each other, but gfortran likes to append underscores to user-defined variables, and then it can't find the file the variable is referencing! You can suppress this using the flag
Now I am stuck on a new error. It looks like the ccsm script is almost reaching the end, as it's using ld, the gcc linking mechanism, to tie all the files together. Then the build log says:
/usr/bin/ld: seq_domain_mct.o(.debug_info+0x1c32): unresolvable R_386_32 relocation against symbol 'mpi_fortran_argv_null'
/usr/bin/ld: final link failed: Nonrepresentable section on output
collect2: ld returned 1 exit status
I'm having trouble finding articles on the internet about similar errors, and the gcc and ld manpages are so long that trying every compiler flag isn't really an option. Any ideas?
Update: Fixed it! In
scripts/ccsm_utils/Build/Makefile, I changed
LD := $(F90) to
LD := gcc -shared. The build was finally successful! Now off to try and run it...
The good thing is that, since I re-started this project a few days ago, I haven't spent very long stuck on any one error. I'm constantly having problems, but I move through them pretty quickly! In the meantime, I'm learning a lot about the model and how it fits everything together during installation. I've also come a long way with Linux programming in general. Considering that when I first installed Ubuntu a few months ago, and sheepishly called my friend to ask where to find the command line, I'm quite proud of my progress!
I hope this article will help future Ubuntu users install CESM, as it seems to have a few quirks that even Mac OS X doesn't experience (eg make vs gmake). For the rest of you, apologies if I have bored you to tears!