1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178
|
# (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";
|