mirror of https://github.com/ecmwf/eccodes.git
250 lines
13 KiB
Modula-2
250 lines
13 KiB
Modula-2
# GRIB1 SECTION 4, Binary data section
|
|
# Length of section
|
|
position offsetSection4;
|
|
|
|
# Due to a trick done by GRIBEX to support large GRIBs, we need a special treatment
|
|
# of the message length and of the section4 lenth, so instead of
|
|
# section_length[3] section4Length;
|
|
# we get:
|
|
g1_section4_length[3] section4Length(totalLength);
|
|
|
|
meta section4Pointer section_pointer(offsetSection4,section4Length,4);
|
|
|
|
g1_half_byte_codeflag halfByte;
|
|
flags[1] dataFlag "grib1/11.table" = 0 : read_only;
|
|
signed[2] binaryScaleFactor = 0 : read_only,dump;
|
|
ibmfloat referenceValue : read_only,dump;
|
|
|
|
meta referenceValueError reference_value_error(referenceValue,ibm);
|
|
|
|
flagbit sphericalHarmonics(dataFlag,7) : dump;
|
|
flagbit complexPacking(dataFlag,6) : dump;
|
|
flagbit integerPointValues(dataFlag,5) : dump;
|
|
flagbit additionalFlagPresent(dataFlag,4) : edition_specific,dump;
|
|
|
|
# second order packing
|
|
if (complexPacking && sphericalHarmonics==0) {
|
|
unsigned[1] widthOfFirstOrderValues : dump ;
|
|
unsigned [2] N1;
|
|
flags[1] extendedFlag "grib1/11-2.table";
|
|
|
|
# Undocumented use of octet 14 extededFlags
|
|
# Taken from d2ordr.F
|
|
# R------- only bit 1 is reserved.
|
|
# -0------ single datum at each grid point.
|
|
# -1------ matrix of values at each grid point.
|
|
# --0----- no secondary bit map.
|
|
# --1----- secondary bit map present.
|
|
# ---0---- second order values have constant width.
|
|
# ---1---- second order values have different widths.
|
|
# ----0--- no general extended second order packing.
|
|
# ----1--- general extended second order packing used.
|
|
# -----0-- standard field ordering in section 4.
|
|
# -----1-- boustrophedonic ordering in section 4.
|
|
# ------00 no spatial differencing used.
|
|
# ------01 1st-order spatial differencing used.
|
|
# ------10 2nd-order " " " .
|
|
# ------11 3rd-order " " " .
|
|
|
|
#ksec4(8)
|
|
flagbit matrixOfValues (extendedFlag,6) = 0 : dump;
|
|
#ksec4(9)
|
|
flagbit secondaryBitmapPresent (extendedFlag,5) = 0 : dump;
|
|
#ksec4(10)
|
|
flagbit secondOrderOfDifferentWidth (extendedFlag,4) = 0 : dump;
|
|
#ksec4(12)
|
|
flagbit generalExtended2ordr (extendedFlag,3) = 0 : dump;
|
|
#ksec4(13)
|
|
flagbit boustrophedonicOrdering (extendedFlag,2) = 0 : dump;
|
|
#ksec4(14)
|
|
flagbit twoOrdersOfSPD (extendedFlag,1) = 0 : dump;
|
|
#ksec4(15)
|
|
flagbit plusOneinOrdersOfSPD (extendedFlag,0) = 0 : dump;
|
|
meta orderOfSPD evaluate(plusOneinOrdersOfSPD + 2 * twoOrdersOfSPD);
|
|
alias secondaryBitmap = secondaryBitmapPresent;
|
|
alias boustrophedonic=boustrophedonicOrdering;
|
|
} else {
|
|
transient orderOfSPD=2;
|
|
transient boustrophedonic=0;
|
|
}
|
|
transient hideThis=0;
|
|
|
|
concept packingType {
|
|
#set uses the last one
|
|
#get returns the first match
|
|
"grid_simple" = { sphericalHarmonics = 0; complexPacking = 0; additionalFlagPresent = 0;}
|
|
"grid_ieee" = { sphericalHarmonics = 0; complexPacking = 0;
|
|
integerPointValues=1; additionalFlagPresent=1;}
|
|
"spectral_complex" = { sphericalHarmonics = 1; complexPacking = 1;
|
|
additionalFlagPresent = 0; }
|
|
"spectral_simple" = { sphericalHarmonics = 1; complexPacking = 0; additionalFlagPresent = 0;
|
|
representationMode=1;}
|
|
"spectral_ieee" = { sphericalHarmonics = 1; complexPacking = 1;
|
|
additionalFlagPresent = 0;hideThis=1; }
|
|
"grid_simple_matrix" = { sphericalHarmonics = 0; complexPacking = 0; additionalFlagPresent = 1;}
|
|
|
|
"grid_second_order_row_by_row" = { sphericalHarmonics = 0; complexPacking = 1; secondOrderOfDifferentWidth=1;
|
|
matrixOfValues=0; secondaryBitmapPresent=0; generalExtended2ordr=0; }
|
|
"grid_second_order_constant_width" = { sphericalHarmonics = 0; complexPacking = 1; secondOrderOfDifferentWidth=0;
|
|
matrixOfValues=0; secondaryBitmapPresent=1; generalExtended2ordr=0; }
|
|
"grid_second_order_general_grib1" = { sphericalHarmonics = 0; complexPacking = 1; secondOrderOfDifferentWidth=1;
|
|
matrixOfValues=0; secondaryBitmapPresent=1; generalExtended2ordr=0; }
|
|
"grid_second_order_no_SPD" = { sphericalHarmonics = 0; complexPacking = 1; secondOrderOfDifferentWidth=1;
|
|
matrixOfValues=0; secondaryBitmapPresent=0; generalExtended2ordr=1;
|
|
plusOneinOrdersOfSPD=0; twoOrdersOfSPD=0;}
|
|
"grid_second_order" = { sphericalHarmonics = 0; complexPacking = 1; secondOrderOfDifferentWidth=1;
|
|
matrixOfValues=0; secondaryBitmapPresent=0; generalExtended2ordr=1;
|
|
plusOneinOrdersOfSPD=0; twoOrdersOfSPD=1; boustrophedonic=1;}
|
|
"grid_second_order" = { sphericalHarmonics = 0; complexPacking = 1; secondOrderOfDifferentWidth=1;
|
|
matrixOfValues=0; secondaryBitmapPresent=0; generalExtended2ordr=1;
|
|
plusOneinOrdersOfSPD=0; twoOrdersOfSPD=1; boustrophedonic=0;}
|
|
"grid_second_order_no_boustrophedonic" = { sphericalHarmonics = 0; complexPacking = 1; secondOrderOfDifferentWidth=1;
|
|
matrixOfValues=0; secondaryBitmapPresent=0; generalExtended2ordr=1;
|
|
plusOneinOrdersOfSPD=0; twoOrdersOfSPD=1; boustrophedonic=0;}
|
|
"grid_second_order_boustrophedonic" = { sphericalHarmonics = 0; complexPacking = 1; secondOrderOfDifferentWidth=1;
|
|
matrixOfValues=0; secondaryBitmapPresent=0; generalExtended2ordr=1;
|
|
plusOneinOrdersOfSPD=0; twoOrdersOfSPD=1; boustrophedonic=1;}
|
|
"grid_second_order_SPD1" = { sphericalHarmonics = 0; complexPacking = 1; secondOrderOfDifferentWidth=1;
|
|
matrixOfValues=0; secondaryBitmapPresent=0; generalExtended2ordr=1;
|
|
plusOneinOrdersOfSPD=1; twoOrdersOfSPD=0; }
|
|
"grid_second_order_SPD2" = { sphericalHarmonics = 0; complexPacking = 1; secondOrderOfDifferentWidth=1;
|
|
matrixOfValues=0; secondaryBitmapPresent=0; generalExtended2ordr=1;
|
|
plusOneinOrdersOfSPD=0; twoOrdersOfSPD=1; }
|
|
"grid_second_order_SPD3" = { sphericalHarmonics = 0; complexPacking = 1; secondOrderOfDifferentWidth=1;
|
|
matrixOfValues=0; secondaryBitmapPresent=0; generalExtended2ordr=1;
|
|
plusOneinOrdersOfSPD=1; twoOrdersOfSPD=1; }
|
|
# The following are not in GRIB edition 1.
|
|
# They are added here to stop failures when setting packingType. The packing itself is not changed
|
|
"grid_jpeg" = { sphericalHarmonics = 0; complexPacking = 0; additionalFlagPresent = 0;}
|
|
"grid_png" = { sphericalHarmonics = 0; complexPacking = 0; additionalFlagPresent = 0;}
|
|
"grid_ccsds" = { sphericalHarmonics = 0; complexPacking = 0; additionalFlagPresent = 0;}
|
|
"grid_simple_log_preprocessing" = { sphericalHarmonics = 0; complexPacking = 0; additionalFlagPresent = 0;}
|
|
} : dump;
|
|
|
|
|
|
alias ls.packingType=packingType;
|
|
alias typeOfPacking=packingType;
|
|
|
|
if( binaryScaleFactor == -32767) {
|
|
unsigned[1] bitsPerValue : dump ;
|
|
alias numberOfBitsContainingEachPackedValue = bitsPerValue;
|
|
alias accuracy = bitsPerValue;
|
|
|
|
constant dataRepresentationTemplateNumber = 0;
|
|
constant bitMapIndicator = 0;
|
|
# For grib 1 -> 2
|
|
position offsetBeforeData;
|
|
transient numberOfCodedValues=numberOfPoints;
|
|
meta values data_dummy_field(
|
|
section4Length,
|
|
offsetBeforeData,
|
|
offsetSection4,
|
|
unitsFactor,
|
|
unitsBias,
|
|
changingPrecision,
|
|
numberOfCodedValues,
|
|
bitsPerValue,
|
|
referenceValue,
|
|
binaryScaleFactor,
|
|
decimalScaleFactor,
|
|
optimizeScaleFactor,
|
|
halfByte,
|
|
packingType,
|
|
grid_ieee,precision,
|
|
missingValue,
|
|
numberOfPoints,
|
|
bitmap
|
|
) : dump;
|
|
} else {
|
|
template dataValues "grib1/data.[packingType:s].def";
|
|
}
|
|
|
|
position offsetAfterData;
|
|
|
|
transient dataLength=(offsetAfterData-offsetBeforeData)/8;
|
|
|
|
if (bitmapPresent==1) {
|
|
alias numberOfEffectiveValues=numberOfDataPoints;
|
|
} else {
|
|
alias numberOfEffectiveValues=numberOfCodedValues;
|
|
}
|
|
|
|
_if (sphericalHarmonics) {
|
|
alias numberOfEffectiveValues=numberOfValues;
|
|
}
|
|
|
|
meta changeDecimalPrecision decimal_precision(bitsPerValue,decimalScaleFactor,changingPrecision,values) : edition_specific;
|
|
meta decimalPrecision decimal_precision(bitsPerValue,decimalScaleFactor,changingPrecision) : edition_specific;
|
|
alias setDecimalPrecision=changeDecimalPrecision;
|
|
|
|
meta bitsPerValueAndRepack bits_per_value(values,bitsPerValue) : edition_specific;
|
|
alias setBitsPerValue=bitsPerValueAndRepack;
|
|
meta setPackingType packing_type(values,packingType) : edition_specific;
|
|
|
|
meta scaleValuesBy scale_values(values,missingValue) : edition_specific;
|
|
meta offsetValuesBy offset_values(values,missingValue) : edition_specific;
|
|
|
|
concept gridType {
|
|
#set uses the last one
|
|
#get returns the first match
|
|
"regular_ll" = {dataRepresentationType = 0; sphericalHarmonics = 0; PLPresent=0;}
|
|
"reduced_ll" = {dataRepresentationType = 0; sphericalHarmonics = 0; PLPresent=1; Ni=missing(); }
|
|
"mercator" = {dataRepresentationType = 1; sphericalHarmonics = 0; PLPresent=0; }
|
|
"lambert" = {dataRepresentationType = 3; sphericalHarmonics = 0; PLPresent=0; }
|
|
"polar_stereographic" = {dataRepresentationType = 5; sphericalHarmonics = 0; PLPresent=0; }
|
|
"UTM" = {dataRepresentationType = 6; sphericalHarmonics = 0; PLPresent=0; }
|
|
"simple_polyconic" = {dataRepresentationType = 7; sphericalHarmonics = 0; PLPresent=0; }
|
|
"albers" = {dataRepresentationType = 8; sphericalHarmonics = 0; PLPresent=0; }
|
|
"miller" = {dataRepresentationType = 9; sphericalHarmonics = 0; PLPresent=0; }
|
|
"rotated_ll" = {dataRepresentationType = 10; sphericalHarmonics = 0; PLPresent=0; }
|
|
"stretched_ll" = {dataRepresentationType = 20; sphericalHarmonics = 0; PLPresent=0; }
|
|
"stretched_rotated_ll" = {dataRepresentationType = 30; sphericalHarmonics = 0; PLPresent=0; }
|
|
"regular_gg" = {dataRepresentationType = 4; sphericalHarmonics = 0; PLPresent=0; }
|
|
"rotated_gg" = {dataRepresentationType = 14; sphericalHarmonics = 0; PLPresent=0; }
|
|
"stretched_gg" = {dataRepresentationType = 24; sphericalHarmonics = 0; PLPresent=0; }
|
|
"stretched_rotated_gg" = {dataRepresentationType = 34; sphericalHarmonics = 0; PLPresent=0; }
|
|
"reduced_gg" = {dataRepresentationType = 4; sphericalHarmonics = 0;
|
|
PLPresent=1; numberOfPointsAlongAParallel = missing();
|
|
iDirectionIncrement = missing(); ijDirectionIncrementGiven=0;}
|
|
|
|
"reduced_rotated_gg" = {dataRepresentationType = 14; sphericalHarmonics = 0;
|
|
PLPresent=1; numberOfPointsAlongAParallel = missing();
|
|
iDirectionIncrement = missing(); ijDirectionIncrementGiven=0;}
|
|
"reduced_stretched_gg" = {dataRepresentationType = 24; sphericalHarmonics = 0;
|
|
PLPresent=1; numberOfPointsAlongAParallel = missing();
|
|
iDirectionIncrement = missing(); ijDirectionIncrementGiven=0;}
|
|
"reduced_stretched_rotated_gg" = {dataRepresentationType = 34; sphericalHarmonics = 0;
|
|
PLPresent=1; numberOfPointsAlongAParallel = missing();
|
|
iDirectionIncrement = missing(); ijDirectionIncrementGiven=0;}
|
|
|
|
# For consistency add the prefix regular_
|
|
"regular_rotated_gg" = { dataRepresentationType = 14; sphericalHarmonics = 0; PLPresent=0; } # = rotated_gg
|
|
"regular_stretched_gg" = { dataRepresentationType = 24; sphericalHarmonics = 0; PLPresent=0; } # = stretched_gg
|
|
"regular_stretched_rotated_gg" = { dataRepresentationType = 34; sphericalHarmonics = 0; PLPresent=0; } # = stretched_rotated_gg
|
|
|
|
"sh" = {dataRepresentationType = 50; sphericalHarmonics = 1; PLPresent=0; }
|
|
"rotated_sh" = {dataRepresentationType = 60; sphericalHarmonics = 1; PLPresent=0; }
|
|
"stretched_sh" = {dataRepresentationType = 70; sphericalHarmonics = 1; PLPresent=0; }
|
|
"stretched_rotated_sh" = {dataRepresentationType = 80; sphericalHarmonics = 1; PLPresent=0; }
|
|
"space_view" = {dataRepresentationType = 90; sphericalHarmonics = 0; PLPresent=0; }
|
|
"unknown" = {PLPresent=0;}
|
|
"unknown_PLPresent" = {PLPresent=1;}
|
|
} : dump;
|
|
|
|
alias ls.gridType=gridType;
|
|
alias geography.gridType=gridType;
|
|
alias typeOfGrid=gridType;
|
|
|
|
meta projSourceString proj_string(gridType, 0): hidden;
|
|
meta projTargetString proj_string(gridType, 1): hidden;
|
|
alias projString = projTargetString : hidden;
|
|
|
|
meta getNumberOfValues size(values) : edition_specific,dump ;
|
|
|
|
if (complexPacking==0 || sphericalHarmonics==1) {
|
|
padtoeven padding_sec4_1(offsetSection4,section4Length) ;
|
|
}
|
|
|
|
meta md5Section4 md5(offsetSection4,section4Length);
|
|
alias md5DataSection = md5Section4;
|