NetCDF - format danych meteorologicznych

materiały seminaryjne 27-11-2000     

1. Formaty danych meteorologicznych:

2. NetCDF

   NetCDF - Network Common Data

    http://www.unidata.ucar.edu/packages/netcdf/  

3. Cechy formatu NetCDF:

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:

b)             języki w jakich napisane zostały biblioteki  NetCDF-u:

   c) niektóre programy czytające pliki NetCDF:

5.Struktura pliku NetCDF.  

przykładowy plik w NetCDF-ie

a) header - część opisują?ci opisujšca zmienne informacje o: 

b) sekcja danych - zawiera  właściwe dane o:

c) typy zmiennych:

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:

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
       nVariables: 7  
       nGlobalAttributes: 3  
       RecordDimension: 'time'  
       nRecords: 1  
       Permission: 'nowrite'  
       DefineMode: 'data'  
       FillMode: 'fill'  
       MaxNameLen: 0  

      ·        czytanie globalnych atrybutów

        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)