123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313 |
- PRO read_enact, Files, DepRange=DepRange, $
- NumData=NumData, $
- OutLats=OutLats, OutLons=OutLons, Instruments=OutInst, $
- Platform=OutPlatform, $
- OutDeps=OutDeps, OutSObs=OutSObs, OutSQC=OutSQC, $
- OutTObs=OutTObs, OutTQC=OutTQC, OutDates=OutDates, $
- OutTMod=OutTMod, OutSMod=OutSMod, rmdi=rmdi, quiet=quiet, $
- iobs=outiobs, jobs=outjobs, kobs=outkobs, $
- ProfileNum=OutProfileNum
- ;------------------------------------------------------------------------------------------
- ;Program to read in data from an ENACT format file containing profile data.
- ;
- ; Inputs:
- ; File => File name to be read in
- ; DepRange => (optional) Range of depths for which the data is to be extracted.
- ;
- ; Outputs:
- ; NumProfs => Number of profiles -Integer
- ; Latitudes => Latitudes(NumProfs) -Real
- ; Longitudes => Longitudes(NumProfs) -Real
- ; Dates => Dates(NumProfs) -Date/time structure.
- ; Instruments => Instrument type (NumProfs) -String
- ; Depths => Depths of each ob (NumProfs) -Real
- ; Salinity => Salinity (psu) (NumProfs) -Real
- ; SalQC => QC flag for salinity (NumProfs) 1=> Good -Int
- ; Temperature => Temperature (deg C) (NumProfs) -Real
- ; TempQC => QC flag for temperature (NumProfs) 1=> Good -Int
- ; ModelT => Model temperature (deg C) (NumProfs) -Real
- ; ModelS => Model salinity (psu) (NumProfs) -Real
- ; rmdi => Missing data indicator -Real
- ;
- ;Author: Matt Martin. 5/10/07.
- ;------------------------------------------------------------------------------------------
- rmdi = 99999.
- if NOT keyword_set(DepRange) then DepRange=[0.,1.e1] ;Default to top 10 metres.
- NumFiles=n_elements(Files)
- ifile2=0
- for ifile = 0, NumFiles-1 do begin
- File = Files(ifile)
-
- ;1. Open the netcdf file
- ncid = ncdf_open(File, /nowrite)
- if ncid lt 0 and not keyword_set(quiet) then print, 'Error opening file '+File
- if ncid ge 0 then begin
- if not keyword_set(quiet) then print, 'Opened file '+File+' successfully'
-
- ;2. Get info about file
- ncinfo = ncdf_inquire(ncid)
- ; if not keyword_set(quiet) then , ncinfo
- ;3. Read in the relevant dimensions
- for idim = 0, ncinfo.ndims-1 do begin
- ncdf_diminq, ncid, idim, name, dimlen
- if name eq 'N_PROF' then NumProfs = dimlen $
- else if name eq 'N_LEVELS' then NumLevels = dimlen $
- else if name eq 'STRING4' then str4 = dimlen
- endfor
-
- ;4. Set up arrays and read in the data
- if (NumProfs gt 0) then begin
- JulDays = fltarr(NumProfs)
- Latitudes = fltarr(NumProfs)
- Longitudes = fltarr(NumProfs)
- BytInsts = intarr(4, NumProfs)
- Instruments = strarr(NumProfs)
- Platforms = strarr(NumProfs)
- Instrumentsa = strarr(NumLevels, NumProfs)
- Platformsa = strarr(NumLevels, NumProfs)
- Depths = fltarr(NumLevels, NumProfs)
- Salinity = fltarr(NumLevels, NumProfs)
- SalQC = intarr(NumLevels, NumProfs)
- Temperature = fltarr(NumLevels, NumProfs)
- TempQC = intarr(NumLevels, NumProfs)
- ModelT = fltarr(NumLevels, NumProfs)
- ModelS = fltarr(NumLevels, NumProfs)
- ProfileNum = replicate(1,NumLevels)#indgen(NumProfs)
-
- varid = ncdf_varid(ncid, 'JULD')
- ncdf_varget, ncid, varid, JulDays
-
- ; print,JulDays
-
- ; BaseDate = var_to_dt(1950,1,1)
- ; BaseDate=JULDAY(1,1,1950,0,0)
- BaseDate=double(JULDAY(1,1,1950,0,0)) ;should be at 0 UTC
- ; info,BaseDate
- Dates = replicate(BaseDate, NumLevels,NumProfs)
- ; info,dates
- for iprof = 0L, NumProfs-1 do begin
- secs = JulDays(iprof)* 24. * 60. * 60.
- ; dt = dt_add(BaseDate, second=secs)
- dt=BaseDate+JulDays(iprof)
- ; CALDAT, dt, mon, day, year, hour, minute, second
- ; print,dt-BaseDate, mon, day, year, hour, minute, second
- Dates(0:NumLevels-1,iprof) = replicate(dt,NumLevels)
- endfor
-
-
- varid = ncdf_varid(ncid, 'LONGITUDE')
- ncdf_varget, ncid, varid, Longitudes
- varid = ncdf_varid(ncid, 'LATITUDE')
- ncdf_varget, ncid, varid, Latitudes
- varid = ncdf_varid(ncid, 'DEPH_CORRECTED')
- ncdf_varget, ncid, varid, Depths
- res = ncdf_attinq( ncid, varid , '_FillValue')
- if res.length gt 0 and res.datatype ne "UNKNOWN" then ncdf_attget, ncid, varid, '_FillValue', FillVal $
- else begin
- res = ncdf_attinq( ncid, varid , '_fillvalue')
- ncdf_attget, ncid, varid, '_fillvalue', FillVal
- endelse
- pts = where(Depths eq FillVal, count)
- if count gt 0 then Depths(pts) = rmdi
- ; if keyword_set(Salinity) then begin
- varid = ncdf_varid(ncid, 'PSAL_CORRECTED')
- if (varid ne -1) then begin
- ; if not keyword_set(quiet) then print,'reading psal_corrected'
- ncdf_varget, ncid, varid, Salinity
- res = ncdf_attinq( ncid, varid , '_FillValue')
- if res.length gt 0 and res.datatype ne "UNKNOWN" then ncdf_attget, ncid, varid, '_FillValue', FillVal $
- else begin
- res = ncdf_attinq( ncid, varid , '_fillvalue')
- ncdf_attget, ncid, varid, '_fillvalue', FillVal
- endelse
- pts = where(Salinity eq FillVal, count)
- if count gt 0 then Salinity(pts) = rmdi
- endif
- varid = ncdf_varid(ncid, 'PSAL_CORRECTED_QC')
- ncdf_varget, ncid, varid, SalQC
- res = ncdf_attinq( ncid, varid , '_FillValue')
- if res.length gt 0 and res.datatype ne "UNKNOWN" then ncdf_attget, ncid, varid, '_FillValue', FillVal $
- else begin
- res = ncdf_attinq( ncid, varid , '_fillvalue')
- ncdf_attget, ncid, varid, '_fillvalue', FillVal
- endelse
- SalQC = SalQC - 48
- ; endif
- ; if keyword_set(Temperature) then begin
- varid = ncdf_varid(ncid, 'POTM_CORRECTED')
- if (varid ne -1) then begin
- ; if not keyword_set(quiet) then print,'reading potm_corrected'
- ncdf_varget, ncid, varid, Temperature
- res = ncdf_attinq( ncid, varid , '_FillValue')
- if res.length gt 0 and res.datatype ne "UNKNOWN" then ncdf_attget, ncid, varid, '_FillValue', FillVal $
- else begin
- res = ncdf_attinq( ncid, varid , '_fillvalue')
- ncdf_attget, ncid, varid, '_fillvalue', FillVal
- endelse
- ; if not keyword_set(quiet) then print,'Temp fill value ',fillval
- pts = where(Temperature eq FillVal, count)
- if count gt 0 then Temperature(pts) = rmdi
- endif
- varid = ncdf_varid(ncid, 'POTM_CORRECTED_QC')
- ncdf_varget, ncid, varid, TempQC
- TempQC = TempQC - 48
- ; endif
- ; if keyword_set(OutTMod) then begin
- varid = ncdf_varid(ncid, 'POTM_Hx')
- if (varid ne -1) then begin
- ncdf_varget, ncid, varid, ModelT
- res = ncdf_attinq( ncid, varid , '_FillValue')
- if res.length gt 0 and res.datatype ne "UNKNOWN" then ncdf_attget, ncid, varid, '_FillValue', FillVal $
- else begin
- res = ncdf_attinq( ncid, varid , '_fillvalue')
- ncdf_attget, ncid, varid, '_fillvalue', FillVal
- endelse
- pts = where(ModelT eq FillVal, count)
- if count gt 0 then ModelT(pts) = rmdi
- endif else begin
- ModelT=rmdi
- endelse
- ; endif
- ; if keyword_set(OutSMod) then begin
- varid = ncdf_varid(ncid, 'PSAL_Hx')
- if (varid ne -1) then begin
- ncdf_varget, ncid, varid, ModelS
- res = ncdf_attinq( ncid, varid , '_FillValue')
- if res.length gt 0 and res.datatype ne "UNKNOWN" then ncdf_attget, ncid, varid, '_FillValue', FillVal $
- else begin
- res = ncdf_attinq( ncid, varid , '_fillvalue')
- ncdf_attget, ncid, varid, '_fillvalue', FillVal
- endelse
- pts = where(ModelS eq FillVal, count)
- if count gt 0 then ModelS(pts) = rmdi
- endif else begin
- ModelS=rmdi
- endelse
- ; endif
- varid = ncdf_varid(ncid, 'WMO_INST_TYPE')
- ncdf_varget, ncid, varid, BytInsts
-
- pts = where(BytInsts(0,*) eq 32 and $
- BytInsts(1,*) eq 56 and $
- BytInsts(2,*) eq 50 and $
- BytInsts(3,*) eq 48, count)
- if count gt 0 then Instruments(pts) = 'BUOYS' ; 820
-
- pts = where(BytInsts(0,*) eq 32 and $
- BytInsts(1,*) eq 52 and $
- BytInsts(2,*) eq 48 and $
- BytInsts(3,*) eq 49, count)
- if count gt 0 then Instruments(pts) = 'XBT' ; 401
-
- pts = where(BytInsts(0,*) eq 32 and $
- BytInsts(1,*) eq 55 and $
- BytInsts(2,*) eq 52 and $
- BytInsts(3,*) eq 49, count)
- if count gt 0 then Instruments(pts) = 'TESAC' ; 741
-
- pts = where(BytInsts(0,*) eq 32 and $
- BytInsts(1,*) eq 56 and $
- BytInsts(2,*) eq 51 and $
- BytInsts(3,*) eq 49, count)
- if count gt 0 then Instruments(pts) = 'ARGO' ; 831
-
- pts = where(Instruments eq '', count)
- if count gt 0 then Instruments(pts) = 'UNKNOWN'
-
- varid = ncdf_varid(ncid, 'PLATFORM_NUMBER')
- ncdf_varget, ncid, varid, platforms
- platforms=string(platforms)
-
- for i=0,numlevels-1 do begin
- platformsa(i,*)=platforms
- instrumentsa(i,*)=instruments
- endfor
- 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, 'KOBS')
- if (varid ne -1) then ncdf_varget, ncid, varid, kobsval
-
- ;Select those obs in the required depth range
- ; Lats = replv(Latitudes(*), [NumLevels,NumProfs],1)
- ; Lons = replv(Longitudes(*), [NumLevels,NumProfs],1)
- Lons=fltarr(NumLevels,NumProfs)
- Lats=fltarr(NumLevels,NumProfs)
- iobs=fltarr(NumLevels,NumProfs)
- jobs=fltarr(NumLevels,NumProfs)
-
- for i=0L,NumProfs-1 do begin
- Lats(*,i)=Latitudes(i)
- Lons(*,i)=Longitudes(i)
- if (n_elements(iobsval) gt 0) then $
- iobs(*,i)=iobsval(i)
- if (n_elements(jobsval) gt 0) then $
- jobs(*,i)=jobsval(i)
- endfor
-
- pts = where(Depths ge DepRange(0) and Depths le DepRange(1), NumData)
-
- if ifile2 eq 0 then begin
- OutTObs = [Temperature(pts)]
- OutSObs = [Salinity(pts)]
- OutTMod = [ModelT(pts)]
- OutSMod = [ModelS(pts)]
- OutTQC = [TempQC(pts)]
- OutSQC = [SalQC(pts)]
- OutDeps = [Depths(pts)]
- OutLats = [Lats(pts)]
- OutLons = [Lons(pts)]
- OutDates= [Dates(pts)]
- OutInst= [Instrumentsa(pts)]
- OutPlatform= [Platformsa(pts)]
- OutProfileNum = [ProfileNum(pts)]
- if (n_elements(iobsval) gt 0) then outiobs = [iobs(pts)]
- if (n_elements(jobsval) gt 0) then outjobs = [jobs(pts)]
- if (n_elements(kobsval) gt 0) then outkobs = [kobsval(pts)]
-
- endif else begin
- OutTObs = [OutTObs,Temperature(pts)]
- OutSObs = [OutSObs,Salinity(pts)]
- OutTMod = [OutTMod,ModelT(pts)]
- OutSMod = [OutSMod,ModelS(pts)]
- OutTQC = [OutTQC,TempQC(pts)]
- OutSQC = [OutSQC,SalQC(pts)]
- OutDeps = [OutDeps,Depths(pts)]
- OutLats = [OutLats,Lats(pts)]
- OutLons = [OutLons,Lons(pts)]
- OutDates= [OutDates,Dates(pts)]
- OutInst= [OutInst,Instrumentsa(pts)]
- OutPlatform = [OutPlatform, Platformsa(pts)]
- OutProfileNum = [OutProfileNum, ProfileNum(pts)]
- if (n_elements(iobsval) gt 0) then outiobs = [outiobs, iobs(pts)]
- if (n_elements(jobsval) gt 0) then outjobs = [outjobs, jobs(pts)]
- if (n_elements(kobsval) gt 0) then outkobs = [outkobs, kobsval(pts)]
- endelse
- ifile2=ifile2+1
- endif
- ncdf_close, ncid
- endif
-
- endfor ;ifile
- END
|