123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312 |
- ;+
- PRO read_sla, Files, NumObs=NumObs, $
- Latitudes=Latitudes, Longitudes=Longitudes, $
- ObsSLA=ObsSLA, ModSLA=ModSLA, SLAQC=SLAQC, $
- MDT=MDT, Satellites=Satellites, Types=Types, Dates=Dates, rmdi=rmdi, $
- iobs=iobs, jobs=jobs, mstp=mstp, quiet=quiet, track=track
- ;+-----------------------------------------------------------
- ;IDL program to read in netcdf files of altimeter data.
- ;
- ;Author: D. J. Lea - Feb 2008
- ;
- ;------------------------------------------------------------
- rmdi = -99999.
- NumFiles=n_elements(Files)
- ;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)
- ; var = ncdf_varinq( ncid, "SLA" )
- if not keyword_set(quiet) then print,'ncinfo.ndims ',ncinfo.ndims
- ncdf_diminq, ncid, 0, name, NData
- NData2=0
- cycles=1
- if (ncinfo.ndims gt 2) then ncdf_diminq, ncid, 2, name, NData2
- if (ncinfo.ndims gt 1) then ncdf_diminq, ncid, 1, name, cycles
- if not keyword_set(quiet) then print,NData, NData2
- NData=max([NData*cycles, NData2*cycles])
- ; print,NData, NData2
- 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)
- mdtval = fltarr(NData)
- bytQC = bytarr(NData)
- QC = fltarr(NData)
- Dats = dblarr(NData)
- trackval = intarr(NData)
- Sats = intarr(NData)
- strSats= strarr(NData)
- StrVal = strarr(8)
- ; dts = replicate(!dt_base, NData)
- dts = dblarr(NData)
-
- ; info,lons
- varid = ncdf_varid(ncid, 'LONGITUDE')
- scale_factor=1.
- if (varid eq -1) then begin
- varid = ncdf_varid(ncid, 'Longitudes')
- if (varid eq -1) then begin
- varid = ncdf_varid(ncid, 'longitude')
- endif
- ncdf_attget, ncid, varid, 'scale_factor', scale_factor
- endif
- ncdf_varget, ncid, varid, lons
- lons=lons*scale_factor
- ; info, lons
- if (cycles gt 1) then begin
- lonsn=lons
- for i=1,cycles-1 do begin
- lonsn=[lonsn,lons]
- endfor
- lons=lonsn
- endif
- ; info, lons
- ; info,lats
- varid = ncdf_varid(ncid, 'LATITUDE')
- scale_factor=1.
- if (varid eq -1) then begin
- varid = ncdf_varid(ncid, 'Latitudes')
- if (varid eq -1) then begin
- varid = ncdf_varid(ncid, 'latitude')
- endif
- ncdf_attget, ncid, varid, 'scale_factor', scale_factor
- endif
- ncdf_varget, ncid, varid, lats
- lats=lats*scale_factor
- ; info, lats
- if (cycles gt 1) then begin
- latsn=lats
- for i=1,cycles-1 do begin
- latsn=[latsn,lats]
- endfor
- lats=latsn
- endif
-
- ; info, lats
-
- varid = ncdf_varid(ncid, 'JULD')
- if (varid eq -1) then begin
- varid = ncdf_varid(ncid, 'time')
- endif
- if (varid ne -1) then begin
- ncdf_varget, ncid, varid, Dats
- endif else begin
- varid = ncdf_varid(ncid, 'BeginDates')
- ncdf_varget, ncid, varid, Bds
- ; print,bds
- ; info, bds
- if (cycles gt 1) then begin
- bds=transpose(bds)
- endif
- varid = ncdf_varid(ncid, 'NbPoints')
- ncdf_varget, ncid, varid, nbpoints
- ; Read in dataindexes and deltat in cls format file
- ; These are used to adjust dates
- varid = ncdf_varid(ncid, 'DeltaT')
- if (varid ne -1) then begin
- ncdf_varget, ncid, varid, deltat
- ncdf_attget, ncid, varid, 'scale_factor', scale_factor
- deltat=deltat*scale_factor
- varid = ncdf_varid(ncid, 'DataIndexes')
- ncdf_varget, ncid, varid, dataindexes
-
- endif
- print, 'deltat ',deltat
- ; print, 'dataindexes ',dataindexes
- ; info, nbpoints
- ; print,nbpoints
- ; info, cycles
- cumbds=[0]
- nbpointst=nbpoints
- dataindexest=dataindexes
- for i=1,cycles-1 do begin
- nbpointst=[nbpointst,nbpoints]
- dataindexest=[dataindexest,dataindexes]
- endfor
- cumbds=[0,total(nbpointst,/cumulative)]
- ; if not keyword_set(quiet) then print,'cumbds ',cumbds
- nel=n_elements(Bds)
- ; info,nel
- ; if not keyword_set(quiet) then print,n_elements(dats)
- for i=0,nel-1 do begin
- ; print,'*',i, cumbds(i+1)-cumbds(i)
- ; print,i,cumbds(i),cumbds(i+1)-1
- dats(cumbds(i):cumbds(i+1)-1)=bds(i)
- trackval(cumbds(i):cumbds(i+1)-1)=i
- dataindexest(cumbds(i):cumbds(i+1)-1)=dataindexest(cumbds(i):cumbds(i+1)-1)-dataindexest(cumbds(i))
- endfor
-
- ; adjust dats based on dataindex
- dats=dats+dataindexest*deltat/86400.
-
-
- ; print, dats
- endelse
-
- dts=RefDate + Dats
-
- varid = ncdf_varid(ncid, 'MISSION')
- if (varid ne -1) then begin
- ncdf_varget, ncid, varid, Sats
- ncdf_attget, ncid, varid, 'Value_0', StrVal0
- ncdf_attget, ncid, varid, 'Value_1', StrVal1
- ncdf_attget, ncid, varid, 'Value_2', StrVal2
- ncdf_attget, ncid, varid, 'Value_3', StrVal3
- ncdf_attget, ncid, varid, 'Value_4', StrVal4
- ncdf_attget, ncid, varid, 'Value_5', StrVal5
- ncdf_attget, ncid, varid, 'Value_6', StrVal6
- ncdf_attget, ncid, varid, 'Value_7', StrVal7
- StrVal=[StrVal0, StrVal1, StrVal2, StrVal3, StrVal4, $
- StrVal5, StrVal6, StrVal7]
- for ival = 0, 7 do begin
- pts = where(Sats eq ival, count)
- if count gt 0 then strSats(pts) = StrVal(ival)
- endfor
- endif
- varid = ncdf_varid(ncid, 'SLA')
- ncdf_varget, ncid, varid, obsval
- ncdf_attget, ncid, varid, '_FillValue', FillValue
- scale_factor=1.
- add_offset=0.
- ;if (ncinfo.ndims gt 2) then ncdf_attget, ncid, varid, 'scale_factor', scale_factor
- ncviq=ncdf_varinq(ncid, varid)
- for iatt=0,ncviq.natts-1 do begin
- ncaiq=ncdf_attname(ncid, varid, iatt)
- if ( ncaiq eq 'scale_factor') then ncdf_attget, ncid, varid, 'scale_factor', scale_factor
- if ( ncaiq eq 'add_factor') then ncdf_attget, ncid, varid, 'add_factor', add_factor
- endfor
- if not keyword_set(quiet) then print,'SLA scale factor: ',scale_factor
- if not keyword_set(quiet) then print,'SLA add offset: ',add_offset
- if not keyword_set(quiet) then print,'SLA FillValue: ',FillValue
- pts = where(obsval eq FillValue, count)
- ; if not keyword_set(quiet) then print,count
- obsval=obsval*scale_factor+add_offset
- if count gt 0 then obsval(pts) = rmdi
-
- varid = ncdf_varid(ncid, 'SLA_Hx')
- if (varid ne -1) then begin
- ncdf_varget, ncid, varid, modval
- ncdf_attget, ncid, varid, '_FillValue', FillValue
- ; if not keyword_set(quiet) then print,'SLA_Hx FillValue ',FillValue
- pts = where(modval eq FillValue or modval eq -9999.0, count)
- ; if not keyword_set(quiet) then print,count
- if count gt 0 then modval(pts) = rmdi
- endif
-
- varid = ncdf_varid(ncid, 'SLA_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) = 1.
- endif
-
- varid = ncdf_varid(ncid, 'MDT')
- if (varid ne -1) then ncdf_varget, ncid, varid, mdtval
- varid = ncdf_varid(ncid, 'data_source')
- if varid ne -1 then begin
- ncdf_varget, ncid, varid, obstyp
- endif else begin
- varid = ncdf_varid(ncid, 'MISSION')
- if varid ne -1 then ncdf_varget, ncid, varid, obstyp
- endelse
- ; reads in multi cycle data the wrong way round!
- if (cycles gt 1) then begin
- obsval=reform(obsval,[cycles,ndata/cycles])
- obsval=transpose(obsval)
- modval=reform(modval,[cycles,ndata/cycles])
- modval=transpose(modval)
- QC=reform(QC,[cycles,ndata/cycles])
- QC=transpose(QC)
- endif
- varid = ncdf_varid(ncid, 'IOBS')
- if (varid ne -1) then ncdf_varget, ncid, varid, iobsval
- varid = ncdf_varid(ncid, 'JOBS')
- if (varid ne -1) then ncdf_varget, ncid, varid, jobsval
- varid = ncdf_varid(ncid, 'MSTP')
- if (varid ne -1) then ncdf_varget, ncid, varid, mstpval
- ; info, obssla
- ; info, obsval
- ; info, modsla
- ; info, modval
-
- if ifile2 eq 0 then begin
- Latitudes = [float(lats)]
- Longitudes = [float(lons)]
- ObsSLA = [obsval(*)]
- ModSLA = [modval(*)]
- MDT = [mdtval]
- SLAQC = [QC]
- Dates = [dts]
- Satellites = [strSats]
- if (n_elements(obstyp) gt 0) then Types = [obstyp]
- if (n_elements(iobsval) gt 0) then iobs = [iobsval]
- if (n_elements(jobsval) gt 0) then jobs = [jobsval]
- if (n_elements(mstpval) gt 0) then mstp = [mstpval]
- if (n_elements(trackval) gt 0) then track = [trackval]
- endif else begin
- Latitudes = [Latitudes, float(lats)]
- Longitudes = [Longitudes, float(lons)]
- ObsSLA = [ObsSLA, obsval(*)]
- ModSLA = [ModSLA, modval(*)]
- MDT = [MDT, mdtval]
- SLAQC = [SLAQC, QC]
- Dates = [Dates, dts]
- Satellites = [Satellites, strSats]
- if (n_elements(obstyp) gt 0) then Types = [Types, obstyp]
- if (n_elements(iobsval) gt 0) then iobs = [iobs, iobsval]
- if (n_elements(jobsval) gt 0) then jobs = [jobs, jobsval]
- if (n_elements(mstpval) gt 0) then mstp = [mstp, mstpval]
- if (n_elements(trackval) gt 0) then tracks = [track, trackval]
- endelse
- ifile2=ifile2+1
- endif
- ncdf_close, ncid
- endif
- endfor ; ifile
-
- NumObs = n_elements(Latitudes)
- END
|