Mildly perturbed by the issues I'd been having, and also concerned about the feasibility of automatically processing and aggregating the data for each of the many stations using a Graphical User Interface (GUI) program, I decided to look at Python tools for dealing with the raw netCDF-formatted data. I ended up trying out the pydap module, using it to fetch and processes a single netCDF file at a time from a specific HTTP URL (example); to my great consternation I did not have any luck when providing providing the module a local URL (file://). Trying to average the data rapidly proved to be non-trivial, as the data was both plentiful, non-contiguous, and oscillating. I eventually managed to hack something together, but its validity was rather questionable, and it remained an open question how to deal with both fetching all datasets over HTTP (feasible, but possibly hacky) and averaging all datasets (probably PhD-level numeric analysis).
It was also becoming rapidly apparent to me that tide gauge data was entirely insufficient for the task at hand. The main reason for this is that tide gauges provide data for the Relative Sea Level (RSL) at the gauge; this is a problem because factors like Glacial Isostatic Adjustment (GIA), which causes the land to rise relative to the sea, as well as other factors cause each gauge to be representative of its local area only rather than the ocean as a whole. While methods have been developed to approximate a GMSL in spite of these difficulties, I didn't have the time to dig through all of them, and finding the occasional paywall when searching for articles that may or may not contain the algorithms I'd need was rather disheartening. It was also becoming clear to me that there was another method for measuring GMSL besides tide gauges: satellite altimeters.
Compiling RADS was simple enough for me, albeit likely non-trivial to a novice GNU/Linux user due to a dependency issue; specifically, RADS requires the netCDF library with Fortran 90 support compiled in as mentioned in the RADS README file. Trying to compile using the provided libnetcdf-dev on Ubuntu 14.04 LTS failed due to missing Fortran 90 support, and checking the build log shows checking for Fortran flag to compile .f90 files... none, thus I needed to manually provide Fortran 90 support. I was able to get this working by downloading the netCDF library from some long-forgotten location and enabling Fortran 90 support with ./configure –enable-f90, then telling RADS to configure against this library via ./configure –with-netcdf-lib=/path/to/netcdf-4.1.3/liblib –with-netcdf-lib=/path/to/netcdf-4.1.3/fortran –with-netcdf-inc=/path/to/netcdf-4.1.3/f90. After fixing the dependency issue I had no problem building and running RADS.
Unsurprisingly, the RADS software doesn't come bundled with the satellite data. This is a good thing, because there is lots of data; the data for the above-mentioned satellites currently takes up 200 GiB, but note that there is also data from other satellites, and the data will only grow with time. In order to get the data one must follow the instructions in the RADS User Manual, the exact steps will not be detailed here. I decided to place the data under /usr/local/share/rads so that it would be accessible system-wide.
The RADS tool itself consists of a series of subcommands such as rads2asc, which takes the satellite data and turns it into text (ASCII) format. Note that the RADSDATAROOT environment variable must be set before invocation, otherwise the tool won't find the data. The tool allows one to specify what data one is interested in for output; in my case, the -V sla option provided data for Sea Level Average (SLA, which, when taken globally ought to be equivalent to the GMSL), the –ymd begin,end command allowed me to specify a date range, and the –lat min,max option allowed me to process the data by latitude as my client had requested, awesome! Oddly enough, the inclination of the satellites means that no data has been gathered at +66 or -66 degrees latitude. I will discuss a few things that I learned about graphing the data in the next section; for now pretend that the data has been graphed satisfactorily.
Processing the data this way produced graphs that were surprisingly different from those published by the University of Colorado, so I contacted the authors to see what could be causing the discrepancies. It turns out that generating an unweighted average causes the extreme (higher/lower) latitudes to be oversampled due to satellite inclination; the solution is to use radsstat, which divides measurements into a series of grids and then computes a weighted average of the grids, giving a more accurate result. Likewise, I had been sampling by day, but the complete cycle for a satellite is approximately 9.91 days, so any single day might overweight certain regions and underweight others; the solution is to use the -C start,end option to measure by specific cycles rather than dates (a list of satellite cycles can be found here). Changing these things helped align the graphs that I generated with the aforementioned, published ones.
There are tons of features that RADS that I have yet to explore. Since calculating the GMSL involves many factors that one may or may not wish to correct for, and many models which provide corrections as best they are able, RADS allows the user to specify a custom configuration file detailing which corrections to use and how to apply them. I did not get this far in my work, as I currently have no idea which corrective models to apply.
![]() ![]() ![]() |
\n\n
); plotting with index 0::1 then plots each data set. The next step was to give the data some color, which was done by setting the linetype of each index to the desired style (13 on my system) via set linetype 1 pt 13 and set linetype 2 pt 13 and then enabling colors by plotting with lc variable and changing the using specifier; since my data was in CSV-format with the first column being a sparsely-filled year label (as in, the first column was either blank or the first datapoint of the year) and the second column being the data, the specifier was changed to 0:2:(column(-2) + 1):xtic(1). The problem with this specification, however, is that the first specifier, which is the position of the item in the data set, is reset for each data set, thus each satellite's data overlaps as in the above middle graph. The solution was to set a variable, col, before calling plot via col = 0 and then replacing the specifier with an expression that increments col: (col = col + 1) instead of simply 0, but see below for a more accurate solution.
![]() ![]() ![]() |
![]() ![]() |