I said that AFAIK S+C’s code for UAH isn’t available but VV pointed me to Eli who pointed me to ncdc.noaa.gov/cdr/operationalcdrs.html which offered me RSS and UAH. UAH is the one we want to take the piss out of, so read it and weep, below.
First, though, as far as I can tell it doesn’t even tell you what version of UAH this corresponds to (ah, but actually it 5.4. You can tell this by reading things like “The program txx_1_5.4”. Yay). Under “1.3 Document Maintenance” it does say: When requested by NOAA, if there have been any changes in procedures required for the production of the products or if the description of procedures has inadvertent omissions or errors, we will update this; and there certainly have been updated to UAH since 2011; but the doc is still the original.
I’m also a teensy bit unclear about what its describing: on the face of it, its missing rather a lot, because it says The deep layer temperature products described here come from measurements produced by Advanced Microwave Sounding Units (AMSU-As, hereafter “AMSU”) … Before AMSU, the Microwave Sounding Units (MSUs) flew on the NOAA polar orbiters since late 1978. Processing of the older MSU data, except in the homogenization routines, is not addressed by this document. WTF?
[Update: by bizarre co-incidence, S+C+B have just released, or announced, v6. As they say Many procedures have been modified or entirely reworked, and most of the software has been rewritten from scratch. There’s just a hint that they may have rushed this out: After three years of work, we have (hopefully) finished our Version 6.0, but who knows.
Ha. Actually, there’s rather more than a hint that this may be rushed: if you read to the end, they back off: This should be considered a “beta” release of Version 6.0, and we await users’ comments to see whether there are any obvious remaining problems in the dataset.
Eli, never one to stand on ceremony, steps into the torrent of ignorant praise over at Roy’s to ask where’s the code? But its not available “yet”.]
Anyway, onto the excuses (my bold):
The codes described here and provided to NOAA have not been optimized in a software engineering sense. Much of the programming structure originated over 20 years ago, starting around 1989, and was written by the authors who came from a generation of self-taught programmers and have little formal computer programming training. Much of the work was done with little funding support, so no professional programmers were utilized. In Christy’s code, there are numerous sections devoted to image creation through NCARgraphics for detection of problems, but which are not necessary for the production of the ASCII files desired by the users.
There is little use of subroutines in Spencer’s code, but more in Christy’s. Continuity of operational procedures has taken precedence over elegance or speed of execution.
As algorithm enhancements were tested, many were abandoned, but those portions of the code were simply commented out rather than deleted, i.e. they are vestigial in reality. While this is somewhat sloppy from a software design standpoint, the practical advantage of this is to provide a detailed reminder of what has been tried before.
In some cases, rather than having unused code commented out, there are sections which are never branched to in the operational running of the code because an initial adjustable parameter is always assigned a single value. A good example is diurnal adjustment of the AMSU data, for which much code is included, but has never been used operationally. In other cases, a particular ancillary analysis was needed for a publication, but not needed for production runs. These sections are usually commented out.
Most of the programs have array dimensioning and assignments which must be manually updated every month and year, since (at this writing) they only handle data through July 2011. Similarly, if a new satellite is added, then there are program changes which must be made to accommodate those new datasets.
The programs were originally developed on an SGI workstation or an IBM mainframe,and then later transitioned to Linux. As a result, all previous binary input and output files had a byte-ordering issue. We retained the SGI handling of binary files, so some of the programs must be run with a byte-swap option used on execute. This might not be an issue if NOAA re-generates all output files from scratch, but if our previous outputfiles are used, there will be a problem.
Also, we have had problems processing of a month’s worth of global AMSU data causing some sort of memory size allocation exceedance during a single program execution, which leads to only a portion of the data being processed properly. This is also handled with a special option during execute.
Well, that looks like a perfect way of making sure that no-one at all ever reads your code. But it also looks like a way of ending up with a hideous heap of gunk that even you can’t update.
ksat1 = 18 ! NOAA 15, 16, or 18 ksat2 = 18 klun1 = 165 klun2 = 165 istore=1 diffdat=0 do 1000 ksat=ksat1,ksat2 !...15 or 16 or 18 c....OPEN OUTPUT FILES .................................................................. if(ksat.eq.15)then OPEN(191,FILE='/rstor/spencer/amsu/grids/amsu_n15_monthly_2LT.grd',form='binary',access='append') OPEN(192,FILE='/rstor/spencer/amsu/grids/amsu_n15_monthly_2.grd',form='binary',access='append') OPEN(193,FILE='/rstor/spencer/amsu/grids/amsu_n15_monthly_4.grd',form='binary',access='append') end if if(ksat.eq.16)then OPEN(191,FILE='/rstor/spencer/amsu/grids/amsu_n16_monthly_2LT.grd',form='binary',access='append') OPEN(192,FILE='/rstor/spencer/amsu/grids/amsu_n16_monthly_2.grd',form='binary',access='append') OPEN(193,FILE='/rstor/spencer/amsu/grids/amsu_n16_monthly_4.grd',form='binary',access='append') end if if(ksat.eq.18)then OPEN(191,FILE='/rstor/spencer/amsu/grids/amsu_n18_monthly_2LT.grd',form='binary',access='append') OPEN(192,FILE='/rstor/spencer/amsu/grids/amsu_n18_monthly_2.grd',form='binary',access='append') OPEN(193,FILE='/rstor/spencer/amsu/grids/amsu_n18_monthly_4.grd',form='binary',access='append') end if c.....input files....... if(ksat.eq.15)then c OPEN(11,FILE='/rstor/spencer/amsu/grids/amsu_n15_9808_newLC.grd',form='binary') c OPEN(12,FILE='/rstor/spencer/amsu/grids/amsu_n15_9809_newLC.grd',form='binary') ... 100+ similar lines still in the original removed... c OPEN(157,FILE='/rstor/spencer/amsu/grids/amsu_n15_1010_newLC.grd',form='binary') c OPEN(158,FILE='/rstor/spencer/amsu/grids/amsu_n15_1011_newLC.grd',form='binary') c OPEN(159,FILE='/rstor/spencer/amsu/grids/amsu_n15_1012_newLC.grd',form='binary') c OPEN(160,FILE='/rstor/spencer/amsu/grids/amsu_n15_1101_newLC.grd',form='binary') c OPEN(161,FILE='/rstor/spencer/amsu/grids/amsu_n15_1102_newLC.grd',form='binary') c OPEN(162,FILE='/rstor/spencer/amsu/grids/amsu_n15_1103_newLC.grd',form='binary') c OPEN(163,FILE='/rstor/spencer/amsu/grids/amsu_n15_1104_newLC.grd',form='binary') c OPEN(164,FILE='/rstor/spencer/amsu/grids/amsu_n15_1105_newLC.grd',form='binary') OPEN(165,FILE='/rstor/spencer/amsu/grids/amsu_n15_1106_newLC.grd',form='binary') end if
* Does He or Don’t He via Eli, and others: Luther the anger translator.