eccodes/definitions/grib1/data.grid_simple_matrix.def

181 lines
6.0 KiB
Modula-2

# (C) Copyright 2005- ECMWF.
#used in packing
constant constantFieldHalfByte=0;
# moved here to allow different bitsPerValue in second order packing
unsigned[1] bitsPerValue : dump ;
alias numberOfBitsContainingEachPackedValue = bitsPerValue;
alias accuracy = bitsPerValue;
unsigned[2] octetAtWichPackedDataBegins;
flags[1] extendedFlag "grib1/11-2.table";
flagbit matrixOfValues(extendedFlag,3) : dump;
flagbit secondaryBitmapPresent(extendedFlag,2) : dump;
flagbit secondOrderOfDifferentWidth(extendedFlag,1) : dump;
alias secondOrderValuesDifferentWidths = secondOrderOfDifferentWidth;
alias secondaryBitMap=secondaryBitmapPresent;
unsigned[2] NR : dump;
alias firstDimension = NR;
unsigned[2] NC : dump;
alias secondDimension = NC;
flags[1] coordinateFlag1 "grib1/12.table" : dump;
alias firstDimensionCoordinateValueDefinition = coordinateFlag1;
unsigned[1] NC1 : dump;
alias numberOfCoefficientsOrValuesUsedToSpecifyFirstDimensionCoordinateFunction = NC1;
flags[1] coordinateFlag2 "grib1/12.table" : dump;
alias secondDimensionCoordinateValueDefinition = coordinateFlag2;
unsigned[1] NC2 : dump;
alias numberOfCoefficientsOrValuesUsedToSpecifySecondDimensionCoordinateFunction = NC2;
flags[1] physicalFlag1 "grib1/13.table" : dump;
alias firstDimensionPhysicalSignificance = physicalFlag1; # TODO: Check if grib1 and 2 table are the same
flags[1] physicalFlag2 "grib1/13.table" : dump;
alias secondDimensionPhysicalSignificance = physicalFlag2; # TODO: Check if grib1 and 2 table are the same
ibmfloat coefsFirst[NC1] : dump;
ibmfloat coefsSecond[NC2] : dump;
alias data.coefsFirst = coefsFirst;
alias data.coefsSecond=coefsSecond;
position offsetBeforeData;
if(matrixOfValues == 0)
{
constant matrixBitmapsPresent = 0;
position offsetBeforeData;
if(bitmapPresent) {
# For grib1 -> grib2
constant bitMapIndicator = 0;
meta codedValues data_g1simple_packing(
section4Length,
offsetBeforeData,
offsetSection4,
unitsFactor,
unitsBias,
changingPrecision,
numberOfCodedValues,
bitsPerValue,
referenceValue,
binaryScaleFactor,
decimalScaleFactor,
optimizeScaleFactor,
halfByte,
packingType
#grid_ieee
) : read_only;
alias data.packedValues = codedValues;
meta values data_apply_bitmap(codedValues,bitmap,missingValue,binaryScaleFactor) : dump;
# See GRIB-262: The octetAtWichPackedDataBegins cannot be set to a value bigger than 65535!
# This is historic stuff which no longer applies
# when(changed(values)) {set octetAtWichPackedDataBegins=numberOfCodedValues;}
} else {
# For grib1 -> grib2
constant bitMapIndicator = 255;
meta values data_g1simple_packing(
section4Length,
offsetBeforeData,
offsetSection4,
unitsFactor,
unitsBias,
changingPrecision,
numberOfCodedValues,
bitsPerValue,
referenceValue,
binaryScaleFactor,
decimalScaleFactor,
optimizeScaleFactor,
halfByte
) : dump;
alias data.packedValues = values;
}
} else {
#if(secondaryBitmapPresent == 0) { meta error not_implemented(); }
constant matrixBitmapsPresent = 1;
constant bitMapIndicator = 0;
# From GRIBEX:
# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
# ! !
# ! This is the WMO definition, but it is entirely !
# ! inadequate when secondary bit maps are present !
# ! eg 3x3 global grid with a matrix of values !
# ! 12x26 at each point. This gives a bit map with !
# ! a length of 285480 octets which cannot be given!
# ! in 16 bits. !
# ! !
# ! ECMWF uses the following definition for its !
# ! wave model data. !
# ! N - Number of secondary bit maps !
# ! (ie the number of points which are 'not !
# ! missing'). !
# ! This definition will accommodate a 1x1 !
# ! degree global grid. !
# ! !
# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
#
constant datumSize = NC*NR;
transient secondaryBitmapsCount = octetAtWichPackedDataBegins*datumSize; #
transient secondaryBitmapsSize = secondaryBitmapsCount/8;
#alias numberOfDataPoints = secondaryBitmapsCount; # grib 1 -> 2
position offsetBBitmap;
meta secondaryBitmaps g1bitmap(
dummy,
missingValue,
offsetBBitmap,
secondaryBitmapsSize,
dummy) : read_only;
position offsetBeforeData;
meta codedValues data_g1simple_packing(
section4Length,
offsetBeforeData,
offsetSection4,
unitsFactor,
unitsBias,
changingPrecision,
numberOfCodedValues,
bitsPerValue,
referenceValue,
binaryScaleFactor,
decimalScaleFactor,
optimizeScaleFactor,
halfByte
) : read_only;
alias data.packedValues = codedValues;
constant expandBy = NC*NR;
meta secondaryBitmap data_g1secondary_bitmap(bitmap,secondaryBitmaps,missingValue,expandBy,octetAtWichPackedDataBegins);
meta values data_apply_bitmap(codedValues,secondaryBitmap,missingValue,binaryScaleFactor) : dump;
}
meta packingError simple_packing_error(bitsPerValue,binaryScaleFactor,decimalScaleFactor,referenceValue,ibm) : no_copy;
meta numberOfCodedValues number_of_coded_values(bitsPerValue,offsetBeforeData,offsetAfterData,halfByte,numberOfValues) : dump;
template statistics "common/statistics_grid.def";
template missing_values "common/missing_values_grid.def";