[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
netCDF question follow up....
- Subject: netCDF question follow up....
- Date: Fri, 19 Dec 1997 17:13:22 GMT
#
# 19 December 1997
#
Hello Glenn:
Thanks for following up on my email message.
Here are some answers to some of your questions back to me.
>> Just to be sure that I understand you, each station report corresponds
>> to a record, right?
Yes.
>> Some general things you can do to improve performance:
>> 1) Use netcdf-3.
>> 2) Be sure the file is on local disk as opposed to NFS.
>> (If you must access the file over NFS, let me know, there are
>> some other tips I can give you.)
>> 3) Take advantage of the netcdf libary buffering by avoiding use
>> of the NC_SHARE option when opening the file, OR
>> 3) Use the contributed mmapio i/o layer to memory map the file.
>> (You probably can't mmap an NFS file.)
>> 4) Access the variables of a "record" sequentially.
>> (If you need help understanding what I mean by this,
>> send me the output of 'ncdump -h' of one of your typical
>> data sets, and I'll get specific.)
>> It is important to profile your program and see where the problem really
>> lies.
>> I can't tell you how many times we've recieved questions like this only to
>> discover (upon analysis) that the problem lay elsewhere. A common problem
>> in a situation like yours is that the reader does repeated linear searches
>> through the file to find records (stations) of interest.
>> If you are concerned about multiple calls for the various variables making up
>> your record, you can save some overhead by using the netcdf-2 'ncrecget()'
>> calls. It has been our experience that using this call instead of (properly
>> ordered) sequential calls to nc_get_varxxx doesn't save very much time.
>> If you really want to try this, The file format is documented in the
>> User's Guide in Appendix B.
>> http://www.unidata.ucar.edu/packages/netcdf/guidec/guidec-18.html#HEADING18-0
1. To answer some of you questions, I think that we are currently using an
older version of netCDF - version 2.4.3 I think. What level of increase
in speed of access do you suspect we will see going from version 2.x.x
to version 3.x.x?
2. The files we are accessing are on the local disk.
3. I'm not exactly sure how to use the "contributed mmapio i/o layer
to memory map the file..." Could you explain this further?
4. When we read the netCDF data files we read in the whole file, one record
at a time, from the first record to the last record.
I have included an "ncdump -h" output below the double dashed line (=====)
of one of our (smaller) LDAD netCDF data files.
Thanks a lot.
Leigh Angus address@hidden
CIRA phone: (303) 497-6187
NOAA/FSL R/E/FS6 fax: (303) 497-7256
325 Broadway
Boulder, CO Room 269.
==========================================================================
netcdf 19971219_1500 {
dimensions:
maxLDADmessageLen = 256 ;
maxStaTypeLen = 11 ;
maxStaIdLen = 6 ;
maxWeatherLen = 25 ;
maxNameLength = 51 ;
maxHomeWFOlen = 4 ;
maxSkyCover = 6 ;
maxSkyLen = 8 ;
maxSensor = 2 ;
maxRecordPeriods = 3 ;
maxLDADtestLen = 51 ;
recNum = UNLIMITED ; // (157 currently)
variables:
char stationType(recNum, maxStaTypeLen) ;
stationType:long_name = "LDAD station type" ;
char dataProvider(recNum, maxStaTypeLen) ;
dataProvider:long_name = "LDAD data provider" ;
long numericWMOid(recNum) ;
numericWMOid:long_name = "numeric WMO identification" ;
numericWMOid:_FillValue = -2147483647 ;
numericWMOid:missing_value = -9999 ;
numericWMOid:reference = "station table" ;
char stationId(recNum, maxStaIdLen) ;
stationId:long_name = "alphanumeric station Id" ;
stationId:reference = "station table" ;
char stationName(recNum, maxNameLength) ;
stationName:long_name = "alphanumeric station name" ;
stationName:reference = "station table" ;
char homeWFO(recNum, maxHomeWFOlen) ;
homeWFO:long_name = "home WFO Id" ;
float latitude(recNum) ;
latitude:long_name = "latitude" ;
latitude:units = "degree_north" ;
latitude:_FillValue = 3.4028235e+38f ;
latitude:missing_value = -9999. ;
latitude:reference = "station table" ;
float longitude(recNum) ;
longitude:long_name = "longitude" ;
longitude:units = "degree_east" ;
longitude:_FillValue = 3.4028235e+38f ;
longitude:missing_value = -9999. ;
longitude:reference = "station table" ;
float elevation(recNum) ;
elevation:long_name = "elevation" ;
elevation:units = "meter" ;
elevation:_FillValue = 3.4028235e+38f ;
elevation:missing_value = -9999. ;
elevation:reference = "station table" ;
short dataPlatformType(recNum) ;
dataPlatformType:long_name = "data platform type" ;
dataPlatformType:value0 = "stationary" ;
dataPlatformType:value1 = "moving (e.g. floating buoy or ship)"
;
dataPlatformType:_FillValue = -32767s ;
dataPlatformType:missing_value = -9999 ;
float platformTrueDirection(recNum) ;
platformTrueDirection:long_name = "data platform true
direction" ;
platformTrueDirection:units = "degree" ;
platformTrueDirection:_FillValue = 3.4028235e+38f ;
platformTrueDirection:missing_value = -9999. ;
float platformTrueSpeed(recNum) ;
platformTrueSpeed:long_name = "data platform true speed" ;
platformTrueSpeed:units = "meter/sec" ;
platformTrueSpeed:_FillValue = 3.4028235e+38f ;
platformTrueSpeed:missing_value = -9999. ;
double observationTime(recNum) ;
observationTime:long_name = "time of observation" ;
observationTime:units = "seconds since 1-1-1970" ;
observationTime:_FillValue = 3.40282346e+38 ;
observationTime:missing_value = -9999. ;
double reportTime(recNum) ;
reportTime:long_name = "time data was processed by the
provider" ;
reportTime:units = "seconds since 1-1-1970" ;
reportTime:_FillValue = 3.40282346e+38 ;
reportTime:missing_value = -9999. ;
double receivedTime(recNum) ;
receivedTime:long_name = "time data was received" ;
receivedTime:units = "seconds since 1-1-1970" ;
receivedTime:_FillValue = 3.40282346e+38 ;
receivedTime:missing_value = -9999. ;
float temperature(recNum) ;
temperature:long_name = "temperature" ;
temperature:units = "kelvin" ;
temperature:_FillValue = 3.4028235e+38f ;
temperature:missing_value = -9999. ;
double tempChangeTime(recNum) ;
tempChangeTime:long_name = "temperature time of last change" ;
tempChangeTime:units = "seconds since 1970-1-1 00:00:00.0" ;
tempChangeTime:_FillValue = 3.40282346e+38 ;
tempChangeTime:missing_value = -9999. ;
float dewpoint(recNum) ;
dewpoint:long_name = "dew point temperature" ;
dewpoint:units = "kelvin" ;
dewpoint:_FillValue = 3.4028235e+38f ;
dewpoint:missing_value = -9999. ;
float wetBulbTemperature(recNum) ;
wetBulbTemperature:long_name = "wet bulb temperature" ;
wetBulbTemperature:units = "kelvin" ;
wetBulbTemperature:_FillValue = 3.4028235e+38f ;
wetBulbTemperature:missing_value = -9999. ;
float relHumidity(recNum) ;
relHumidity:long_name = "relative humidity" ;
relHumidity:units = "percent" ;
relHumidity:_FillValue = 3.4028235e+38f ;
relHumidity:missing_value = -9999. ;
double rhChangeTime(recNum) ;
rhChangeTime:long_name = "relative humidity time of last
change" ;
rhChangeTime:units = "seconds since 1970-1-1 00:00:00.0" ;
rhChangeTime:_FillValue = 3.40282346e+38 ;
rhChangeTime:missing_value = -9999. ;
float stationPressure(recNum) ;
stationPressure:long_name = "station pressure" ;
stationPressure:units = "pascal" ;
stationPressure:_FillValue = 3.4028235e+38f ;
stationPressure:missing_value = -9999. ;
double stationPressChangeTime(recNum) ;
stationPressChangeTime:long_name = "station press time of last
change" ;
stationPressChangeTime:units = "seconds since 1970-1-1
00:00:00.0" ;
stationPressChangeTime:_FillValue = 3.40282346e+38 ;
float seaLevelPressure(recNum) ;
seaLevelPressure:long_name = "sea level pressure" ;
seaLevelPressure:units = "pascal" ;
seaLevelPressure:_FillValue = 3.4028235e+38f ;
seaLevelPressure:missing_value = -9999. ;
short pressChangeChar(recNum) ;
pressChangeChar:long_name = "character of pressure change" ;
pressChangeChar:value0 = "press same or higher than 3 hrs ago" ;
pressChangeChar:value1 = "increasing then steady" ;
pressChangeChar:value2 = "increasing" ;
pressChangeChar:value3 = "decreasing or steady,then increasing"
;
pressChangeChar:value4 = "steady" ;
pressChangeChar:value5 = "press same or lower than 3 hrs ago" ;
pressChangeChar:value6 = "decreasing then steady" ;
pressChangeChar:value7 = "decreasing" ;
pressChangeChar:value8 = "steady or increasing,then decreasing"
;
pressChangeChar:_FillValue = -32767s ;
pressChangeChar:missing_value = -9999 ;
float pressChange3Hour(recNum) ;
pressChange3Hour:long_name = "3 hour pressure change" ;
pressChange3Hour:units = "pascal" ;
pressChange3Hour:_FillValue = 3.4028235e+38f ;
pressChange3Hour:missing_value = -9999. ;
pressChange3Hour:valid_min = 0. ;
float altimeter(recNum) ;
altimeter:long_name = "altimeter setting" ;
altimeter:units = "pascal" ;
altimeter:_FillValue = 3.4028235e+38f ;
altimeter:missing_value = -9999. ;
altimeter:valid_min = 0. ;
float windDir(recNum) ;
windDir:long_name = "wind direction" ;
windDir:units = "degree" ;
windDir:_FillValue = 3.4028235e+38f ;
windDir:missing_value = -9999. ;
double windDirChangeTime(recNum) ;
windDirChangeTime:long_name = "wind direction time of last
change" ;
windDirChangeTime:units = "seconds since 1970-1-1 00:00:00.0" ;
windDirChangeTime:_FillValue = 3.40282346e+38 ;
windDirChangeTime:missing_value = -9999. ;
float windSpeed(recNum) ;
windSpeed:long_name = "wind speed" ;
windSpeed:units = "meter/sec" ;
windSpeed:_FillValue = 3.4028235e+38f ;
windSpeed:missing_value = -9999. ;
windSpeed:valid_min = 0. ;
double windSpeedChangeTime(recNum) ;
windSpeedChangeTime:long_name = "wind speed time of last
change" ;
windSpeedChangeTime:units = "seconds since 1970-1-1 00:00:00.0"
;
windSpeedChangeTime:_FillValue = 3.40282346e+38 ;
windSpeedChangeTime:missing_value = -9999. ;
float windGust(recNum) ;
windGust:long_name = "wind gust" ;
windGust:units = "meter/sec" ;
windGust:_FillValue = 3.4028235e+38f ;
windGust:missing_value = -9999. ;
windGust:valid_min = 0. ;
double windGustChangeTime(recNum) ;
windGustChangeTime:long_name = "wind gust time of last change" ;
windGustChangeTime:units = "seconds since 1970-1-1 00:00:00.0" ;
windGustChangeTime:_FillValue = 3.40282346e+38 ;
windGustChangeTime:missing_value = -9999. ;
float windDirMin(recNum) ;
windDirMin:long_name = "wind direction at mininum windspeed" ;
windDirMin:units = "degree" ;
windDirMin:_FillValue = 3.4028235e+38f ;
windDirMin:missing_value = -9999. ;
float windDirMax(recNum) ;
windDirMax:long_name = "wind direction at gust" ;
windDirMax:units = "degree" ;
windDirMax:_FillValue = 3.4028235e+38f ;
windDirMax:missing_value = -9999. ;
char skyCover(recNum, maxSkyCover, maxSkyLen) ;
skyCover:long_name = "sky cover" ;
skyCover:reference = "FMH-1" ;
float skyLayerBase(recNum, maxSkyCover) ;
skyLayerBase:long_name = "sky cover layer base" ;
skyLayerBase:units = "meter" ;
skyLayerBase:_FillValue = 3.4028235e+38f ;
skyLayerBase:missing_value = -9999. ;
skyLayerBase:valid_min = 0. ;
float visibility(recNum) ;
visibility:long_name = "visibility" ;
visibility:units = "meter" ;
visibility:_FillValue = 3.4028235e+38f ;
visibility:missing_value = -9999. ;
visibility:valid_min = 0. ;
float totalCloudCover(recNum) ;
totalCloudCover:long_name = "fraction of sky covered by clouds"
;
totalCloudCover:units = "tenths" ;
totalCloudCover:_FillValue = 3.4028235e+38f ;
totalCloudCover:missing_value = -9999. ;
short cloudBaseHeight(recNum) ;
cloudBaseHeight:long_name = "height of the lowest cloud layer" ;
cloudBaseHeight:value0 = "0 to 100 ft" ;
cloudBaseHeight:value1 = "200 to 300 ft" ;
cloudBaseHeight:value2 = "400 to 600 ft" ;
cloudBaseHeight:value3 = "700 to 900 ft" ;
cloudBaseHeight:value4 = "1000 to 1900 ft" ;
cloudBaseHeight:value5 = "2000 to 3200 ft" ;
cloudBaseHeight:value6 = "3300 to 4900 ft" ;
cloudBaseHeight:value7 = "5000 to 6500 ft" ;
cloudBaseHeight:value8 = "7000 to 8000 ft" ;
cloudBaseHeight:value9 = "8500 or higher or no clouds" ;
cloudBaseHeight:value-1 = "unknown or cld base below sfc of
stn" ;
cloudBaseHeight:_FillValue = -32767s ;
cloudBaseHeight:missing_value = -9999 ;
cloudBaseHeight:reference = "FMH-2" ;
char presWeather(recNum, maxWeatherLen) ;
presWeather:long_name = "present weather" ;
presWeather:reference = "FMH-1" ;
short lowLevelCloudType(recNum) ;
lowLevelCloudType:long_name = "low level cloud type" ;
lowLevelCloudType:value0 = "no Cu, Cb, Sc, or St" ;
lowLevelCloudType:value1 = "Cu w/ little vertical extent" ;
lowLevelCloudType:value2 = "Cu w/ moderate or great vertical
extent" ;
lowLevelCloudType:value3 = "Cb w/out fibrous or striated upper
part" ;
lowLevelCloudType:value4 = "Sc formed by spreading Cu" ;
lowLevelCloudType:value5 = "Sc not formed by spreading Cu" ;
lowLevelCloudType:value6 = "St or ragged St" ;
lowLevelCloudType:value7 = "ragged St or ragged Cu" ;
lowLevelCloudType:value8 = "Cu and Sc w/ bases at different
levels" ;
lowLevelCloudType:value9 = "Cb w/ fibrous or striated upper
part" ;
lowLevelCloudType:value-1 = "low clouds not visibile
(obscured)" ;
lowLevelCloudType:_FillValue = -32767s ;
lowLevelCloudType:missing_value = -9999 ;
lowLevelCloudType:reference = "FMH-2" ;
short midLevelCloudType(recNum) ;
midLevelCloudType:long_name = "middle level cloud type" ;
midLevelCloudType:value0 = "no Ac, As, or Ns" ;
midLevelCloudType:value1 = "semi-transparent As" ;
midLevelCloudType:value2 = "opaque As, or Ns" ;
midLevelCloudType:value3 = "semi-transparent Ac predominant" ;
midLevelCloudType:value4 = "Ac continually changing in
appearance" ;
midLevelCloudType:value5 = "Ac invading the sky" ;
midLevelCloudType:value6 = "Ac formed by spreading of Cu or Cb"
;
midLevelCloudType:value7 = "double layered Ac or thick Ac; or
Ac & As" ;
midLevelCloudType:value8 = "turreted Ac or Ac in tuffts" ;
midLevelCloudType:value9 = "Ac of a chaotic sky" ;
midLevelCloudType:value-1 = "middle clouds not visibile
(obscured)" ;
midLevelCloudType:_FillValue = -32767s ;
midLevelCloudType:missing_value = -9999 ;
midLevelCloudType:reference = "FMH-2" ;
short highLevelCloudType(recNum) ;
highLevelCloudType:long_name = "high level cloud type" ;
highLevelCloudType:value0 = "no Ci, Cs, or Cc" ;
highLevelCloudType:value1 = "Ci in filaments or hooks" ;
highLevelCloudType:value2 = "dense Ci & turreted Ci & Ci in
tufts" ;
highLevelCloudType:value3 = "dense Ci orig from Cb, present" ;
highLevelCloudType:value4 = "Ci invading the sky" ;
highLevelCloudType:value5 = "Cs not exceeding 45 degrees
altitude" ;
highLevelCloudType:value6 = "Cs exceeding 45 degrees altitude" ;
highLevelCloudType:value7 = "Cs covering the whole sky" ;
highLevelCloudType:value8 = "Cs not invading the sky" ;
highLevelCloudType:value9 = "Cc alone, or Cc more than (Ci &
Cs)" ;
highLevelCloudType:value-1 = "high clouds not visibile
(obscured)" ;
highLevelCloudType:_FillValue = -32767s ;
highLevelCloudType:missing_value = -9999 ;
highLevelCloudType:reference = "FMH-2" ;
short maxTempRecordPeriod(recNum, maxRecordPeriods) ;
maxTempRecordPeriod:long_name = "maximum temperature recording
period" ;
maxTempRecordPeriod:value0 = "1 hour" ;
maxTempRecordPeriod:value1 = "3 hours" ;
maxTempRecordPeriod:value2 = "6 hours" ;
maxTempRecordPeriod:value3 = "9 hours" ;
maxTempRecordPeriod:value4 = "12 hours" ;
maxTempRecordPeriod:value5 = "15 hours" ;
maxTempRecordPeriod:value6 = "18 hours" ;
maxTempRecordPeriod:value7 = "21 hours" ;
maxTempRecordPeriod:value8 = "24 hours" ;
maxTempRecordPeriod:value9 = "since last station report" ;
maxTempRecordPeriod:_FillValue = -32767s ;
maxTempRecordPeriod:missing_value = -9999 ;
float maximumTemperature(recNum, maxRecordPeriods) ;
maximumTemperature:long_name = "maximum temperature" ;
maximumTemperature:units = "kelvin" ;
maximumTemperature:_FillValue = 3.4028235e+38f ;
maximumTemperature:missing_value = -9999. ;
short minTempRecordPeriod(recNum, maxRecordPeriods) ;
minTempRecordPeriod:long_name = "minimum temperature recording
period" ;
minTempRecordPeriod:value0 = "1 hour" ;
minTempRecordPeriod:value1 = "3 hours" ;
minTempRecordPeriod:value2 = "6 hours" ;
minTempRecordPeriod:value3 = "9 hours" ;
minTempRecordPeriod:value4 = "12 hours" ;
minTempRecordPeriod:value5 = "15 hours" ;
minTempRecordPeriod:value6 = "18 hours" ;
minTempRecordPeriod:value7 = "21 hours" ;
minTempRecordPeriod:value8 = "24 hours" ;
minTempRecordPeriod:value9 = "since last station report" ;
minTempRecordPeriod:_FillValue = -32767s ;
minTempRecordPeriod:missing_value = -9999 ;
float minimumTemperature(recNum, maxRecordPeriods) ;
minimumTemperature:long_name = "minimum temperature" ;
minimumTemperature:units = "kelvin" ;
minimumTemperature:_FillValue = 3.4028235e+38f ;
minimumTemperature:missing_value = -9999. ;
short precipAccumPeriod(recNum, maxRecordPeriods) ;
precipAccumPeriod:long_name = "precipitation accumulation
period" ;
precipAccumPeriod:value0 = "1 hour" ;
precipAccumPeriod:value1 = "3 hours" ;
precipAccumPeriod:value2 = "6 hours" ;
precipAccumPeriod:value3 = "9 hours" ;
precipAccumPeriod:value4 = "12 hours" ;
precipAccumPeriod:value5 = "15 hours" ;
precipAccumPeriod:value6 = "18 hours" ;
precipAccumPeriod:value7 = "21 hours" ;
precipAccumPeriod:value8 = "24 hours" ;
precipAccumPeriod:value9 = "since last station report" ;
precipAccumPeriod:value10 = "since midnight (local time)" ;
precipAccumPeriod:_FillValue = -32767s ;
precipAccumPeriod:missing_value = -9999 ;
float accumulativePrecipAmount(recNum, maxRecordPeriods) ;
accumulativePrecipAmount:long_name = "accumulative
precipitation amount" ;
accumulativePrecipAmount:units = "meter" ;
accumulativePrecipAmount:_FillValue = 3.4028235e+38f ;
accumulativePrecipAmount:missing_value = -9999. ;
accumulativePrecipAmount:valid_min = 0. ;
float precipRate(recNum) ;
precipRate:long_name = "precipitation rate" ;
precipRate:units = "meter/second" ;
precipRate:_FillValue = 3.4028235e+38f ;
precipRate:missing_value = -9999. ;
short precipType(recNum, maxSensor) ;
precipType:long_name = "precipitation type" ;
precipType:value0 = "no precipitation" ;
precipType:value1 = "precipitation present but unclassified" ;
precipType:value2 = "rain" ;
precipType:value3 = "snow" ;
precipType:value4 = "mixed rain and snow" ;
precipType:value29 = "RPU-to-maxSensor communications failure" ;
precipType:value30 = "sensor failure" ;
precipType:_FillValue = -32767s ;
precipType:missing_value = -9999 ;
short precipIntensity(recNum, maxSensor) ;
precipIntensity:long_name = "precipitation intensity" ;
precipIntensity:value0 = "precipitation intensity info not
available" ;
precipIntensity:value2 = "light" ;
precipIntensity:value3 = "moderate" ;
precipIntensity:value4 = "heavy" ;
precipIntensity:_FillValue = -32767s ;
precipIntensity:missing_value = -9999 ;
double timeSinceLastPcp(recNum) ;
timeSinceLastPcp:long_name = "time since last precip" ;
timeSinceLastPcp:units = "second" ;
timeSinceLastPcp:_FillValue = 3.40282346e+38 ;
timeSinceLastPcp:valid_min = 0 ;
timeSinceLastPcp:missing_value = -9999. ;
float solarRadiation(recNum) ;
solarRadiation:long_name = "solar radiation" ;
solarRadiation:units = "watt/meter2" ;
solarRadiation:_FillValue = 3.4028235e+38f ;
solarRadiation:missing_value = -9999. ;
double solarRadChangeTime(recNum) ;
solarRadChangeTime:long_name = "solar radiation time of last
change" ;
solarRadChangeTime:units = "seconds since 1970-1-1 00:00:00.0" ;
solarRadChangeTime:_FillValue = 3.40282346e+38 ;
solarRadChangeTime:missing_value = -9999. ;
float seaSurfaceTemp(recNum) ;
seaSurfaceTemp:long_name = "sea surface temperature" ;
seaSurfaceTemp:units = "kelvin" ;
seaSurfaceTemp:_FillValue = 3.4028235e+38f ;
seaSurfaceTemp:missing_value = -9999. ;
float wavePeriod(recNum) ;
wavePeriod:long_name = "wave period" ;
wavePeriod:units = "second" ;
wavePeriod:_FillValue = 3.4028235e+38f ;
wavePeriod:missing_value = -9999. ;
float waveHeight(recNum) ;
waveHeight:long_name = "wave height" ;
waveHeight:units = "meter" ;
waveHeight:_FillValue = 3.4028235e+38f ;
waveHeight:missing_value = -9999. ;
char rawLDADmesonetMessage(recNum, maxLDADmessageLen) ;
rawLDADmesonetMessage:long_name = "raw text LDAD mesonet
message" ;
char test1(recNum, maxLDADtestLen) ;
test1:long_name = "User defined parameter - test # 1" ;
char test2(recNum, maxLDADtestLen) ;
test2:long_name = "User defined parameter - test # 2" ;
char test3(recNum, maxLDADtestLen) ;
test3:long_name = "User defined parameter - test # 3" ;
char test4(recNum, maxLDADtestLen) ;
test4:long_name = "User defined parameter - test # 4" ;
char test5(recNum, maxLDADtestLen) ;
test5:long_name = "User defined parameter - test # 5" ;
char test6(recNum, maxLDADtestLen) ;
test6:long_name = "User defined parameter - test # 6" ;
char test7(recNum, maxLDADtestLen) ;
test7:long_name = "User defined parameter - test # 7" ;
char test8(recNum, maxLDADtestLen) ;
test8:long_name = "User defined parameter - test # 8" ;
char test9(recNum, maxLDADtestLen) ;
test9:long_name = "User defined parameter - test # 9" ;
// global attributes:
:title = "LDAD automated mesonet data " ;
:history = "revision: 1.0; date: 1997/04/28 20:04:29; author:
angus" ;
}