mirror of https://github.com/ecmwf/eccodes.git
179 lines
5.9 KiB
Modula-2
179 lines
5.9 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";
|