NetCDF - format danych meteorologicznych
materiały seminaryjne 27-11-2000
1.
Formaty danych meteorologicznych:
GRIB'y
CDF (Common Data
File), NASA Space
Science Data Center at Goddard
HDF (Header Data Format), National Center for Supercomputing Applications (NCSA)
NetCDF
2. NetCDF
NetCDF
- Network Common Data
http://www.unidata.ucar.edu/packages/netcdf/
Napisany w 1989 przez: Russ Rew, Glenn Davis, Steve Emerson, Harvey Davies w Unidata Program Center in Boulder (Colorado).
Obecnie szeroko stosowany do zapisu danych atmosferycznych i oceanicznych.
3. Cechy formatu NetCDF:
samoopisujący się (plik netCDF zawiera informacje o zawartych w nim danych).
niezależny od architektury komputera
bezpośredni dostęp do danych (dowolna częć danych może być efektywnie czytana bez wcześniejszego czytania poprzedzająbezpo?redni dostęp
dane mogą być dopisywane do pliku w jednym wymiarze bez przedefiniowania struktury pliku.
istnieje możliwość zmiany struktury pliku oraz kopiowanie innych ustawień ?ć
równoczesna dostępność do pliku przez osobę zapisującą dane jak i użytkowników czytają?ć do
4.
Współdziałanie NetCDF-u z komputerami i oprogramowaniem:
http://www.unidata.ucar.edu/packages/netcdf/software.html
a)
Systemy komputerowe z jakimi współdziała
NetCDF:
AIX-4.3
BSD/OS 3.0
HPUX-10.20, HPUX-11.00
IRIX-5.3, IRIX-6.5, IRIX64-6.5
Linux 2.0.31
OSF1-4.0
BSD/OS 3.0
SunOS-4.1.4, SunOS-5.6 (Sparc and i386)
SUPER-UX 7.2 (NEC SX-4)
ULTRIX-4.5
Win 95/98
b) języki w jakich napisane zostały biblioteki NetCDF-u:
C
C++
Fortran
Perl
Jave
c) niektóre programy czytające pliki NetCDF:
IDL Interface
MATLAB
NCAR Graphics
FERRET
GrADS
HDF Interface
5.Struktura
pliku NetCDF.
a) header - część opisują?ci opisujšca zmienne informacje o:
wymiarach
atrybutach
zmiennych
b)
sekcja danych - zawiera właściwe
dane o:
ograniczonych wymiarach
nieograniczonym (jednym) wymiarze
c) typy zmiennych:
ncbyte
1
Byte
ncchar 1 Byte
ncshort 2 Byte
ncint 4 Byte
ncfloat 4 Byte
ncdouble 8 Byte
Struktura
zapisu danych:
a)
little
Endian
najmniej znaczący bajt znajduje się najniżej w pamięci
komputera
DEC,
ALPHA, IMB PC
b)
big Endian
najbardziej znaczący bajt znajduje się najniżej w pamięci
komputera
CRAY, IBM(RISC), SGI, Sun
NetCDF korzysta z kodowania danych w formacie: XDR (Binary eXternal Data Representation) rozwinięty przez Sun
Microsystems Incorporation.
Prawie wszystkie komputery dopuszczają zapis danych w XDF.
Wskutek tego użytkownicy nie muszą znać struktury binarnej pliku kody
komputerowe czytające i zapisujące dane w NetCDF-ie wyglądają tak samo na różnych
komputerach. NetCDF używa XDF do zapisu zarówno informacji zawartych w
header?ze jak i w sekcji danych.
Koszt czasu pracy procesora użycia XDF zależy od typu
danych oraz od tego czy XDF jest standardem zapisu danych na odpowiednim
komputerze. Dla niektórych typów danych na pewnych komputerach czas potrzebny
na konwersje danych do XDF może być znaczny. Najgorzej wygląda to w czasie
czytanie i zapisu danych typu float na maszynie, która nie używa IEEE (format
floating point operation) jako naturalnej reprezentacji.
6. Ograniczenia
NetCDF-u:
maksymalna wielkość ?ć
pliku
tylko jeden wymiar może być nieograniczony
brak interfejsu do definiowania zmiennych, które są zawarte w innym pliku.
brak możliwości budowy rozbudowanych struktur macierzowych.
7. Matlab toolbox
http://crusty.er.usgs.gov/~cdenham/MexCDF/nc4ml5.html
przykłady:
Czytanie
danych z netCDF-u w matlabie
·
otwieranie pliku
nc=netcdf('nazwa_pliku');
disp(nc)
NetCDF_File:'/home/kmark
/cyrkulacja/eof/EOF.nc'
nDimensions: 3
nGlobalAttributes: 3
nRecords: 1
Permission: 'nowrite'
DefineMode: 'data'
FillMode:
'fill'
MaxNameLen: 0
ittid=att(nc);
attid{1}
NetCDF_Attribute: 'Conventions'
itsType: 'char'
itsLength: 6
itIsUnsigned: 0
attid{1}(:)
COARDS
·
czytanie wymiarów
dimid=dim(nc)
dimid{1}
NetCDF_Dimension: 'lat'
itsLength: 25
dimid{1}(:)
25
·
czytanie zmiennych
vatid=var(nc)
varid{4}
NetCDF_Variable:
'eof1'
itsType: 'float'
itsDimensions: 'time lat lon'
itsLengths: [1 25 42]
itsOrientation: [1 2 3]
nAttributes: 4
itIsAutoscaling: 0
itIsAutoNaNing: 0
itIsUnsigned: 0
itIsQuick:
0
·
atrybuty zmiennej:
v4=att(varid{4})
vr{4}
NetCDF_Attribute: 'valid_range'
itsType: 'float'
itsLength: 2
itIsUnsigned:
0
vr{4}(:) -10.0000 10.0000
·
wypisywanie danych
varid{4}(1,1:2,1:5)
0.1604 0.1454 0.1434 0.1461
0.1417
0.1674 0.1534 0.1468 0.1473
0.1454
Program
w matlabie do generowania
pliku
w netCDF-ie
·
nc=netcdf('prob.nc','noclobber');
deklaracja wymiarów:
nc('lon')=361;
nc('lat')=141;
nc('time')=0;
definiowanie zmiennych
·
nc{'lat'}=ncint('lat');
nc{'lat'}.long_name=ncchar('Latitude');
nc{'lat'}.units=ncchar('degrees_north');
·
nc{'lon'}=ncfloat('lon');
nc{'lon'}.long_name=ncchar('Longitude');
nc{'lon'}.units=ncchar('degrees_east');
·
nc{'time'}=ncdouble('time');
nc{'time'}.long_name=ncchar('Time');
nc{'time'}.units=ncchar('hours
since 1-1-1 00:00:00');
nc{'time'}.delta_t=ncchar('0000-00-01
00:00:00');
·
nc{'AOT'}=ncdouble('time','lat','lon');
nc{'AOT'}.long_name=ncchar('AOT_average');
nc{'AOT'}.missing_value=ncfloat(1.e34);
nc{'AOT'}.units=ncchar('no');
nc{'AOT'}.valid_range=ncfloat([-124.255,117.121]);
·
nc.Conventions=ncchar('COARDS');
nc.title=ncchar('Aerosol
Optical Depth');
nc.description=ncchar('Creaded
by Krzysztof Markowicz 07-02-2000');
·
tnum0=datenum(0,12,30)*24;
tnum=datenum(2000,1,1)*24;
·
load dataAOT
·
nc{'lat'}(:)=[-70:1:70];
nc{'lon'}(:)=[0:1:360];
·
nc{'AOT'}(1,:,:)=AOT(1,:,:);
·
nc{'time'}(1)=tnum-tnum0;
close(nc)