Last fall, PVL MSc Giang spent a productive term with Raymond Pierrehumbert's group at Oxford. In this post, he reflects on his experience from the perspective of a little distance as he looks forward to summing up his MSc work and assesses PhD opportunities. Above (planetary photojournal image PIA01111), a view of one of Io's forced atmospheric components - sodium - which contrasts with the volcanic emission and condensation of sulfur compounds that Giang modelled.
By Tue Giang Nguyen
While I was interning at the University of Oxford, I was involved in atmospheric modelling projects for exoplanets and grateful for working with prominent scientists in my field. As I returned home from the UK, I had briefly forgotten what Canadian winter was like and was promptly reminded as I stepped outside of the airport. Now that I have returned to York University, it is time to reminisce about the things I learned during my short 3-months stay at Oxford.
The atmospheric model I worked with started by recreating Andrew Ingersoll’s 1985 work on modelling the wind flow on Io. Useful assumptions, some more justified than the others, such as making sure the Ionian atmosphere is hydrostatically bound and neglecting Io’s rotation allowed for a simple one-dimensional model of the shallow wave equation. The gist of the dynamics in the model is that sulfur dioxide, abundant on Io’s surface, would sublimate or evaporate when illuminated by the Sun. The sublimated sulfur dioxide would then flow onto the nightside where it is much colder and the atmosphere would condense back onto the surface. This insight on thin and condensable atmospheres is useful for exoplanet research where tidally locked rocky planets would evaporate or sublimate volatiles on the dayside where they would condense on the colder nightside.
Numerical simulation is interesting to say the least; it is a hearty mix of physics, math, and computer science. I have had previous experience in numerical analysis from a project I had worked on in a graduate course building and running a barotropic vorticity model useful for large scale weather prediction. What I have learned then is that even if your knowledge of physics and math is sublime, not knowing the intricacies of programming can be very detrimental.
The model is a system of three differential equations with three dependent variables: temperature, pressure, and flow velocity. The problem was essentially running this system of equations starting with fairly simple boundary conditions. The temperature was greatest (130 K) at the subsolar point where it would cool down until it hits nightside constant low of 50 K. The boundary flow condition is even simpler where it is zero at the subsolar point and it is zero again on the opposite side. The main core of the problem, I realized, is that there wasn’t really any boundary conditions given for the pressure and that part of what I have to do is to guess the initial pressure.
The flow on Io, as Ingersoll’s 1985 solutions show, actually surpasses the speed of sound. Runs with simple parameters and assumptions such as no drag and a high temperature gradient were shown to have flow several times higher than the speed of sound. This meant that the problem has inherent complications of instability akin to flow in a rocket nozzle and that I would have to employ various techniques to try and transition from subsonic flow to supersonic flow. This required a lot of precision to avoid round-off and truncation errors that adds to the instability as you approach the speed of sound.
Getting all the equations into Python wasn’t hard; making sure it runs like you expect was a different story. Even when I used all of the significant figures available for a 32-bit float, my solutions would either exponentially blow up or decay at Mach 0.6 or 0.7. I needed my solutions to get closer to Mach 1 so the next best thing I could do was to increase the resolution of my spatial grid. A shorter spatial step would minimize errors going from point to the next but it also forces the computer to do more calculations which can be very time-intensive at high resolution. The system of equations in the model that required the previous calculations to go into the next calculation meant that there’s no pathway for parallelization and that the code only runs from a single core. To save time, I would need to dynamically change the grid resolution as I approach Mach 1.
Another problem that I encountered was how to store the data as the code was running. Previous codes that I worked on were simple and the outputted dataset did not have to be stored right away. The Io code, with a small enough spatial grid, can generate billions of data points which may be enough to take up enough RAM to crash the computer; some of my more ambitious runs were force terminated as it took up too much RAM in the computer clusters at the Oxford physics department. Also adding diagnostics to your code is very important as most times when your code crashes, you won’t know why or how, you just know that it crashed.
Juggling the problems of making all your variables as precise as it can be, making sure the grid resolution is small enough and making sure it runs within the capabilities of your computer, I can tell you that I absolutely didn’t get close to getting a running code the first try. The problems I encountered weren’t explicitly mentioned in the paper upon which the model was based and I am still very curious how it was done in 1985 with far fewer computational capabilities than what we have now. It took me a lot of tries of changing how and where the resolution would increase to reduce the instability while running on my computers at a reasonable time. When I changed planetary bodies from Io to a hypothesized snow-ball Earth along with more added physics, I still needed to make many small alterations just to get some good runs in.
You can learn a few things from this. First, reproducing experiments and work from earlier publications may be much harder than you think. Programming skills are vital in all sorts of fields within planetary sciences. And while building a program from various models is a science, through increments of small changes, getting your program to run within your capabilities is very much an art.