194 lines
6.0 KiB
Prolog
Executable File
194 lines
6.0 KiB
Prolog
Executable File
PRO read_sst, Files, NumObs=NumObs, $
|
|
Latitudes=Latitudes, Longitudes=Longitudes, $
|
|
ObsSST=ObsSST, ModSST=ModSST, SSTQC=SSTQC, $
|
|
Dates=Dates, rmdi=rmdi, Types=Types, iobs=iobs, jobs=jobs, $
|
|
quiet=quiet
|
|
;------------------------------------------------------------
|
|
;IDL program to read in netcdf files of altimeter data.
|
|
;
|
|
;Author: D. J. Lea - Feb 2008
|
|
;
|
|
;------------------------------------------------------------
|
|
rmdi = -99999.
|
|
NumFiles=n_elements(Files)
|
|
;print,NumFiles
|
|
;RefDate = '1950-01-01'
|
|
;!DATE_SEPARATOR='-'
|
|
RefDate=JULDAY(1,1,1950,0,0) ; should be at 0 UTC
|
|
ifile2=0
|
|
for ifile = 0, NumFiles-1 do begin
|
|
;------------------------------------------------------------
|
|
;1. Open the file containing the data
|
|
ncid = ncdf_open(Files(ifile), /nowrite)
|
|
if ncid lt 0 and not keyword_set(quiet) then print, 'Error opening file '+Files(ifile)
|
|
if ncid ge 0 then begin
|
|
if not keyword_set(quiet) then print, 'Opened file '+Files(ifile)+' successfully'
|
|
|
|
;------------------------------------------------------------
|
|
;2. Read in the dimensions in the file
|
|
ncinfo = ncdf_inquire(ncid)
|
|
|
|
if ncinfo.Ndims eq 1 then begin
|
|
ncdf_diminq, ncid, 0, name, NData
|
|
endif else if ncinfo.Ndims eq 2 then begin
|
|
ncdf_diminq, ncid, 1, name, NData
|
|
if (name eq "string8") then ncdf_diminq, ncid, 0, name, NData
|
|
endif else if ncinfo.Ndims eq 3 then begin
|
|
ncdf_diminq, ncid, 1, name, NLats
|
|
ncdf_diminq, ncid, 2, name, NLons
|
|
NData = NLats * NLons
|
|
endif
|
|
|
|
if not keyword_set(quiet) then print, 'Number of SST data points ',NData
|
|
|
|
if (NData gt 0) then begin
|
|
;------------------------------------------------------------
|
|
;3. Allocate the data arrays and read in the data
|
|
lons = dblarr(NData)
|
|
lats = dblarr(NData)
|
|
obsval = fltarr(NData)
|
|
modval = fltarr(NData)
|
|
bytQC = bytarr(NData)
|
|
QC = fltarr(NData)
|
|
obstyp = intarr(NData)
|
|
Dats = dblarr(NData)
|
|
dts = replicate(!dt_base, NData)
|
|
iobsa = intarr(NData)
|
|
jobsa = intarr(NData)
|
|
|
|
varid = ncdf_varid(ncid, 'LONGITUDE')
|
|
if varid ne -1 then ncdf_varget, ncid, varid, lons $
|
|
else begin
|
|
varid = ncdf_varid(ncid, 'lon')
|
|
ncdf_varget, ncid, varid, lons
|
|
endelse
|
|
|
|
varid = ncdf_varid(ncid, 'LATITUDE')
|
|
if varid ne -1 then ncdf_varget, ncid, varid, lats $
|
|
else begin
|
|
varid = ncdf_varid(ncid, 'lat')
|
|
ncdf_varget, ncid, varid, lats
|
|
endelse
|
|
|
|
varid = ncdf_varid(ncid, 'JULD')
|
|
if varid ne -1 then begin
|
|
ncdf_varget, ncid, varid, Dats
|
|
dts=RefDate + Dats
|
|
|
|
endif else begin
|
|
varid = ncdf_varid(ncid, 'time')
|
|
ncdf_varget, ncid, varid, secs_from_base
|
|
varid = ncdf_varid(ncid, 'sst_dtime')
|
|
ncdf_varget, ncid, varid, dtime
|
|
ncdf_attget, ncid, varid, 'scale_factor', scale_factor
|
|
dtime=dtime*scale_factor
|
|
; RefDate = '1981-01-01'
|
|
RefDate = JULDAY(1,1,1981,0,0) ; should be ref from 0 UTC
|
|
dtime = dtime + secs_from_base
|
|
dts = RefDate + dtime/86400.
|
|
endelse
|
|
|
|
varid = ncdf_varid(ncid, 'SST')
|
|
if varid ne -1 then begin
|
|
ncdf_varget, ncid, varid, obsval
|
|
obsval=float(obsval) ;ensure obsval is a floating point array
|
|
ncdf_attget, ncid, varid, '_FillValue', FillValue
|
|
pts = where(obsval eq FillValue, count)
|
|
if count gt 0 then obsval(pts) = rmdi
|
|
endif else begin
|
|
varid = ncdf_varid(ncid, 'sea_surface_temperature')
|
|
ncdf_varget, ncid, varid, obsval
|
|
obsval=float(obsval) ;ensure obsval is a floating point array
|
|
ncdf_attget, ncid, varid, '_FillValue', FillValue
|
|
ncdf_attget, ncid, varid, 'add_offset', Offset
|
|
ncdf_attget, ncid, varid, 'scale_factor', Scale
|
|
pts = where(obsval ne FillValue, count)
|
|
if count gt 0 then obsval(pts) = Offset + (obsval(pts) *Scale)
|
|
pts = where(obsval eq FillValue, count)
|
|
if count gt 0 then obsval(pts) = rmdi
|
|
endelse
|
|
|
|
varid = ncdf_varid(ncid, 'SST_Hx')
|
|
if varid ne -1 then begin
|
|
ncdf_varget, ncid, varid, modval
|
|
ncdf_attget, ncid, varid, '_FillValue', FillValue
|
|
pts = where(modval eq FillValue, count)
|
|
if count gt 0 then modval(pts) = rmdi
|
|
endif
|
|
|
|
varid = ncdf_varid(ncid, 'SST_QC')
|
|
if varid ne -1 then begin
|
|
ncdf_varget, ncid, varid, bytQC
|
|
ncdf_attget, ncid, varid, '_FillValue', FillValue
|
|
QC(*) = 0.
|
|
pts = where(bytQC eq FillValue, count)
|
|
if count gt 0 then QC(pts) = rmdi
|
|
pts = where(bytQC ne 48, count)
|
|
if count gt 0 then QC(pts) = bytQC(pts)-48
|
|
endif else begin
|
|
varid = ncdf_varid(ncid, 'confidence_flag')
|
|
ncdf_varget, ncid, varid, bytQC
|
|
QC = float(bytQC)
|
|
endelse
|
|
|
|
varid = ncdf_varid(ncid, 'SST_DATA_SOURCE')
|
|
if varid ne -1 then ncdf_varget, ncid, varid, obstyp $
|
|
else begin
|
|
varid = ncdf_varid(ncid, 'data_source')
|
|
if varid ne -1 then ncdf_varget, ncid, varid, obstyp
|
|
endelse
|
|
|
|
varid = ncdf_varid(ncid, 'callsign')
|
|
if varid ne -1 then begin
|
|
ncdf_varget, ncid, varid, callsign
|
|
tmp=strtrim(string(obstyp),2)+' '+strtrim(string(callsign),2)
|
|
obstyp=tmp
|
|
endif else begin
|
|
varid = ncdf_varid(ncid, 'SST_CALL_SIGN')
|
|
if varid ne -1 then begin
|
|
ncdf_varget, ncid, varid, callsign
|
|
tmp=strtrim(string(obstyp),2)+' '+strtrim(string(callsign),2)
|
|
obstyp=tmp
|
|
endif
|
|
endelse
|
|
|
|
varid = ncdf_varid(ncid, 'IOBS')
|
|
if (varid ne -1) then ncdf_varget, ncid, varid, iobsa
|
|
|
|
varid = ncdf_varid(ncid, 'JOBS')
|
|
if (varid ne -1) then ncdf_varget, ncid, varid, jobsa
|
|
|
|
if ifile2 eq 0 then begin
|
|
Latitudes = [float(lats)]
|
|
Longitudes = [float(lons)]
|
|
ObsSST = [obsval]
|
|
ModSST = [modval]
|
|
SSTQC = [QC]
|
|
Dates = [dts]
|
|
Types = [obstyp]
|
|
iobs = [iobsa]
|
|
jobs = [jobsa]
|
|
endif else begin
|
|
Latitudes = [Latitudes, float(lats)]
|
|
Longitudes = [Longitudes, float(lons)]
|
|
ObsSST = [ObsSST, obsval]
|
|
ModSST = [ModSST, modval]
|
|
SSTQC = [SSTQC, QC]
|
|
Dates = [Dates, dts]
|
|
Types = [Types, obstyp]
|
|
iobs = [iobs, iobsa]
|
|
jobs = [jobs, jobsa]
|
|
endelse
|
|
|
|
ifile2=ifile2+1
|
|
endif
|
|
ncdf_close, ncid
|
|
|
|
endif
|
|
|
|
endfor ; ifile
|
|
|
|
NumObs = n_elements(Latitudes)
|
|
|
|
END
|