IDL и MatLab получают странные значения из файла NetCDF

#matlab #idl #netcdf #idl-programming-language

#matlab #idl #netcdf #idl-programming-language

Вопрос:

У меня есть файл NetCDF, который содержит данные, представляющие общее количество осадков по всему миру за несколько месяцев (поэтому он хранится в трехмерном массиве). Сначала я убедился, что данные были разумными и как они были сформированы, как в XConv, так и в ncdump. Все выглядит разумно — значения варьируются от очень маленьких (~ 10 ^ -10 — это имеет смысл, поскольку это данные модели и фактически представляют ноль) примерно до 5×10 ^ -3.

Проблемы начинаются, когда я пытаюсь обработать эти данные в IDL или MatLab. Массивы, сгенерированные в этих программах, полны огромных отрицательных чисел, таких как -4×10 ^ 4, со случайными огромными положительными числами, такими как 5000. Как ни странно, глядя на график данных в MatLab относительно широты и долготы (в определенное время), структура осадков выглядит разумной, но значения просто совершенно неверны.

В IDL я считываю файл, чтобы записать его в текстовый файл, чтобы его можно было обработать некоторым программным обеспечением, которое использует очень простые текстовые файлы. Вот код, который я использую:

 PRO nao_heaps

address = '/Users/levyadmin/Downloads/'
file_base = 'output'
ncid = ncdf_open(address   file_base   '.nc')

MONTHS=['january','february','march','april','may','june','july','august','september','october','november','december']

varid_field = ncdf_varid(ncid, "tp")
varid_lon = ncdf_varid(ncid, "longitude")
varid_lat = ncdf_varid(ncid, "latitude")
varid_time = ncdf_varid(ncid, "time")

ncdf_varget,ncid, varid_field, total_precip
ncdf_varget,ncid, varid_lat, lats
ncdf_varget,ncid, varid_lon, lons
ncdf_varget,ncid, varid_time, time

ncdf_close,ncid

lats = reform(lats)
lons = reform(lons)
time = reform(time)
total_precip = reform(total_precip)
total_precip = total_precip*1000. ;put in mm

noLats=(size(lats))(1)
noLons=(size(lons))(1)
noMonths=(size(time))(1)

; the data may not be an integer number of years (otherwise we could make this next loop cleaner)
av_precip=fltarr(noLons,noLats,12)
for month=0, 11 do begin
  year = 0
  while ( (year*12)   month lt noMonths ) do begin
    av_precip(*,*,month) = av_precip(*,*,month)   total_precip(*,*, (year*12) month )
    year  
  endwhile
  av_precip(*,*,month) = av_precip(*,*,month)/year
endfor

fname = address   file_base   '.dat'
OPENW,1,fname
PRINTF,1,'longitude'
PRINTF,1,lons

PRINTF,1,'latitude'
PRINTF,1,lats

for month=0,11 do begin
  PRINTF,1,MONTHS(month)
  PRINTF,1,av_precip(*,*,month)
endfor


CLOSE,1

END
  

У кого-нибудь есть идеи, почему я получаю такие странные значения в MatLab и IDL?!

Комментарии:

1. кстати, я новичок в IDL, поэтому, пожалуйста, не стесняйтесь критиковать мой код!

Ответ №1:

АХ! Найден ответ. Файлы NetCDF используют смещение и масштабный коэффициент для данных, чтобы свести размер файла к минимуму. Чтобы получить правильные значения, мне просто нужно:

 total_precip = offset   (scale_factor * total_precip) ;put into correct range
  

В настоящее время я получаю масштабный коэффициент и смещение из ncdump и жестко кодирую их в свою программу IDL, но кто-нибудь знает, как я могу получить их динамически в своем коде IDL ..?

Комментарии:

1. Эти значения являются «атрибутами» переменной. В MATLAB вы могли бы либо использовать: mathworks.com/help/techdoc/ref/ncreadatt.html или mathworks.com/help/techdoc/ref/netcdf.getatt.html . IDL может иметь эквивалент.

2. и что вы знаете .. поиск в Google выдает: astro.virginia.edu/class/oconnell/astr511/idl_5.1_html /…