NetCDF Kompression von Daten durch Aufsammeln: Unterschied zwischen den Versionen
Aus BAWiki
imported>Lang Guenther (→Vorgehensweise: Text für neues Beispiel überarbeitet) |
imported>Lang Guenther (→Vorgehensweise: Text überarbeitet, Listenvariable durch Kompressionsliste ersetzt) |
||
Zeile 56: | Zeile 56: | ||
*: salinity_3d(lon,lat,depth,time). | *: salinity_3d(lon,lat,depth,time). | ||
*: ''Bemerkung: Indizes beginnen mit Null!'' | *: ''Bemerkung: Indizes beginnen mit Null!'' | ||
Da die benutzte Syntax für die Werte der | Da die benutzte Syntax für die Werte der Kompressionsliste ohne Bedeutung ist, wird nachfolgend die Fortran-Syntax verwendet. | ||
==Komprimieren von Daten== | ==Komprimieren von Daten== | ||
Zeile 65: | Zeile 65: | ||
# Bilde das Feld Mask_3d(:,:,:) auf das Feld Mask(:) ab (Fortran RESHAPE): | # Bilde das Feld Mask_3d(:,:,:) auf das Feld Mask(:) ab (Fortran RESHAPE): | ||
#: Mask(lon*lat*depth). | #: Mask(lon*lat*depth). | ||
# Die Indizes i mit Mask(i) = .true. ergeben dann die Werte der | # Die Indizes i mit Mask(i) = .true. ergeben dann die Werte der Kompressionsliste "datapoint". | ||
# Man subtrahiere den Wert 1 von der | # Man subtrahiere den Wert 1 von der Kompressionsliste, da alle Indizes mit Null beginnen müssen. | ||
# Packe die zu komprimierenden Daten in das zu schreibende Feld (Fortran PACK) unter Verwendung von Mask_3d( :, : ). | # Packe die zu komprimierenden Daten in das zu schreibende Feld (Fortran PACK) unter Verwendung von Mask_3d( :, : ). | ||
Zeile 74: | Zeile 74: | ||
#: Mask_3d(lon,lat,depth). | #: Mask_3d(lon,lat,depth). | ||
# Initialisierung: Mask(:) = .false. . | # Initialisierung: Mask(:) = .false. . | ||
# Man addiere den Wert 1 zur | # Man addiere den Wert 1 zur Kompressionsliste "datapoint" hinzu, da alle Indizes mit Null beginnen müssen. | ||
# Für die Werte der | # Für die Werte der Kompressionsliste setze man Mask(i) = .true. . | ||
# Bilde das Feld Mask(:) auf das Feld Mask_3d(:,:,:) ab (Fortran RESHAPE). | # Bilde das Feld Mask(:) auf das Feld Mask_3d(:,:,:) ab (Fortran RESHAPE). | ||
# Entpacke die zu dekomprimierenden Daten (Fortran UNPACK) unter Verwendung von Mask_3d(:,:,:) und ''_FillValue''. | # Entpacke die zu dekomprimierenden Daten (Fortran UNPACK) unter Verwendung von Mask_3d(:,:,:) und ''_FillValue''. |
Version vom 29. April 2011, 13:37 Uhr
Kurze Beschreibung
Kompression von Daten durch Aufsammeln. Darunter versteht man den Vorgang, dauerhaft fehlende Daten eines Datensatzes (einer Variablen) vor dem Schreiben der Daten aus dem Datensatz zu entfernen.
Beispiel
double lon(lon) ;
- lon:long_name = "geografische Laenge" ;
- lon:units = "degrees_east" ;
- lon:axis = "X" ;
- lon:standard_name = "longitude" ;
double lat(lat) ;
- lat:long_name = "geografische Breite" ;
- lat:units = "degrees_north" ;
- lat:axis = "Y" ;
- lat:standard_name = "latitude" ;
double depth(depth) ;
- depth:long_name = "Tiefe der Datenpunkte" ;
- depth:units = "m" ;
- depth:axis = "Z" ;
- depth:positive = "down" ;
- depth:bounds = "depth_bnd" ;
- depth:standard_name = "depth" ;
double depth_bnd(depth,Two) ; double time(time) ;
- time:long_name = "time" ;
- time:units = "seconds since 2005-07-01 00:00:00 01:00" ;
- time:axis = "T" ;
- time:calendar = "gregorian" ;
- time:standard_name = "time" ;
int datapoint(datapoint) ;
- datapoint:long_name = "Kompressionsliste fuer alle Datenpunkte" ;
- datapoint:compress = "depth lat lon" ;
double salinity_3d(time,datapoint) ;
- salinity_3d:long_name = "tiefengemittelter Salzgehalt" ;
- salinity_3d:units = "0.001" ;
- salinity_3d:valid_range = 0., 40. ;
- salinity_3d:_FillValue = 1.e+30 ;
- salinity_3d:coordinates = "time depth lat lon" ;
- salinity_3d:grid_mapping = "Mesh2_crs" ;
- salinity_3d:standard_name = "sea_water_salinity" ;
Hinweise:
- Unkomprimiert wäre salinity_3d(time,depth,lat,lon) zu verwenden.
- Die Koordinatenvariable "datapoint" enthält die (ein-dimensionalen) Speicherindizes der Positionen mit Daten. Indizes beginnen mit Null!
- An Stelle von depth*lat*lon Datenwerten müssen nur datapoint Werte je Zeitschritt geschrieben werden.
- Diese Form der Kompression scheint bislang nur mit echten Koordinatenvariablen, nicht aber mit Hilfskoordinatenvariablen zu funktionieren.
Vorgehensweise
CDL- und Fortran-Syntax
Es soll die Variable "salinity_3d" betrachtet werden.
- Deklaration in CDL-Syntax:
- salinity_3d(time,depth,lat,lon);
- Bemerkung: Indizes beginnen mit Null!
- Deklaration in Fortran-Syntax:
- salinity_3d(lon,lat,depth,time).
- Bemerkung: Indizes beginnen mit Null!
Da die benutzte Syntax für die Werte der Kompressionsliste ohne Bedeutung ist, wird nachfolgend die Fortran-Syntax verwendet.
Komprimieren von Daten
- Maskenfeld mit identischer Gestalt zu den zu komprimierenden Dimensionen,
- Mask_3d(lon,lat,depth).
- Initialisierung: Mask_3d(:,:,:) = .false. .
- Setze Mask_3d(i,j,k) auf .true., falls die Daten für Position (i,j,k) geschrieben werden sollen.
- Bilde das Feld Mask_3d(:,:,:) auf das Feld Mask(:) ab (Fortran RESHAPE):
- Mask(lon*lat*depth).
- Die Indizes i mit Mask(i) = .true. ergeben dann die Werte der Kompressionsliste "datapoint".
- Man subtrahiere den Wert 1 von der Kompressionsliste, da alle Indizes mit Null beginnen müssen.
- Packe die zu komprimierenden Daten in das zu schreibende Feld (Fortran PACK) unter Verwendung von Mask_3d( :, : ).
Dekomprimieren von Daten
- Maskenfelder Mask und Mask_3d:
- Mask(lon*lat*depth), und
- Mask_3d(lon,lat,depth).
- Initialisierung: Mask(:) = .false. .
- Man addiere den Wert 1 zur Kompressionsliste "datapoint" hinzu, da alle Indizes mit Null beginnen müssen.
- Für die Werte der Kompressionsliste setze man Mask(i) = .true. .
- Bilde das Feld Mask(:) auf das Feld Mask_3d(:,:,:) ab (Fortran RESHAPE).
- Entpacke die zu dekomprimierenden Daten (Fortran UNPACK) unter Verwendung von Mask_3d(:,:,:) und _FillValue.
zurück zu NetCDF