2025-09-05 09:42:21 +02:00

179 lines
5.4 KiB
Prolog
Executable File

PRO read_seaice, Files, NumObs=NumObs, $
Latitudes=Latitudes, Longitudes=Longitudes, $
Obs=Obs, modarr=modarr, qc=qcarr, $
Dates=Dates, rmdi=rmdi, iobs=outiobs, jobs=outjobs, $
nodates=nodates, quiet=quiet
;------------------------------------------------------------
;IDL program to read in netcdf files of sea ice 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
; could read in from file
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)
ncdf_diminq, ncid, 0, name, 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)
Dats = dblarr(NData)
dts = replicate(!dt_base, NData)
iobs = intarr(NData)
jobs = intarr(NData)
; output attribute and variable info
; ncattinfo, id
varid = ncdf_varid(ncid, 'lon')
; if not keyword_set(quiet) then print,varid
if (varid eq -1) then varid = ncdf_varid(ncid, 'LONGITUDE')
ncdf_varget, ncid, varid, lons
varid = ncdf_varid(ncid, 'lat')
; if not keyword_set(quiet) then print,varid
if (varid eq -1) then varid = ncdf_varid(ncid, 'LATITUDE')
ncdf_varget, ncid, varid, lats
if (keyword_set(nodates) eq 0) then begin
varid = ncdf_varid(ncid, 'JULD')
if varid ne -1 then begin
ncdf_varget, ncid, varid, Dats
dts = Dats+RefDate
endif else begin
varid = ncdf_varid(ncid, 'time')
ncdf_varget, ncid, varid, secs_from_base
varid = ncdf_varid(ncid, 'SeaIce_dtime')
ncdf_varget, ncid, varid, dtime
ncdf_attget, ncid, varid, 'scale_factor', scale_factor
if not keyword_set(quiet) then print,'dtime(0): ',dtime(0), 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
endif
if not keyword_set(quiet) then print,'reading sea ice data'
varid = ncdf_varid(ncid, 'sea_ice_concentration')
if not keyword_set(quiet) then print,varid
if (varid eq -1) then begin
varid2 = ncdf_varid(ncid, 'SEAICE')
if (varid2 ne -1) then ncdf_varget, ncid, varid2, obsval
endif
if (varid ne -1) then ncdf_varget, ncid, varid, obsval
if not keyword_set(quiet) then print,'scale_factor'
scale_factor=1.
if (varid ne -1) then ncdf_attget, ncid, varid, 'scale_factor', scale_factor
if not keyword_set(quiet) then print,'_FillValue'
FillValue=99999
; ncdf_attget, ncid, varid, '_FillValue', FillValue
if not keyword_set(quiet) then print,FillValue
pts = where(obsval eq FillValue, count)
if not keyword_set(quiet) then print,'scale_factor ',scale_factor
obsval=obsval*scale_factor
if count gt 0 then obsval(pts) = rmdi
if not keyword_set(quiet) then print,'reading sea ice model values'
varid = ncdf_varid(ncid, 'SEAICE_Hx')
if (varid ne -1) then ncdf_varget, ncid, varid, modval
varid = ncdf_varid(ncid, 'IOBS')
if (varid ne -1) then ncdf_varget, ncid, varid, iobs
varid = ncdf_varid(ncid, 'JOBS')
if (varid ne -1) then ncdf_varget, ncid, varid, jobs
scale_factor=1
pts = where(modval eq FillValue or modval eq -9999, count)
modval=modval*scale_factor
if count gt 0 then modval(pts) = rmdi
if not keyword_set(quiet) then print,'sea ice qc'
varid = ncdf_varid(ncid, 'SEAICE_QC')
if (varid ne -1) then begin
if not keyword_set(quiet) then print,'bytQC'
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 else begin
varid = ncdf_varid(ncid, 'confidence_flag')
ncdf_varget, ncid, varid, QC
endelse
if ifile2 eq 0 then begin
Latitudes = [float(lats)]
Longitudes = [float(lons)]
Obs = [obsval]
Modarr = [modval]
QCarr = [QC]
Dates = [dts]
if (n_elements(iobs) gt 0) then outiobs = [iobs]
if (n_elements(jobs) gt 0) then outjobs = [jobs]
endif else begin
Latitudes = [Latitudes, float(lats)]
Longitudes = [Longitudes, float(lons)]
Obs = [Obs, obsval]
Modarr = [Modarr, modval]
QCarr = [QCarr, QC]
Dates = [Dates, dts]
if (n_elements(iobs) gt 0) then outiobs = [outiobs, iobs]
if (n_elements(jobs) gt 0) then outjobs = [outjobs, jobs]
endelse
ifile2=ifile2+1
endif
if not keyword_set(quiet) then print,'closing file'
ncdf_close, ncid
endif
endfor ; ifile
NumObs = n_elements(Latitudes)
if (n_elements(Modarr) ne NumObs) then Modarr=replicate(rmdi,NumObs)
END