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
|
# (C) Copyright 2005- ECMWF.
# SECTION 3, GRID DEFINITION SECTION
# For grib2 -> 1
constant gridDescriptionSectionPresent = 1;
position offsetSection3;
section_length[4] section3Length ;
meta section3Pointer section_pointer(offsetSection3,section3Length,3);
unsigned[1] numberOfSection = 3 :read_only;
# Source of grid definition
codetable[1] sourceOfGridDefinition ('3.0.table',masterDir,localDir) ;
# Number of data points
unsigned[4] numberOfDataPoints : dump;
alias numberOfPoints=numberOfDataPoints;
alias numberOfGridPoints = numberOfDataPoints;
# Number of octets for optional list of numbers defining number of points
unsigned[1] numberOfOctectsForNumberOfPoints;
# Interpretation of list of numbers defining number of points
codetable[1] interpretationOfNumberOfPoints ('3.11.table',masterDir,localDir) : dump;
if(numberOfOctectsForNumberOfPoints == 0){
transient PLPresent = 0 ;
}else{
transient PLPresent = 1 ;
}
codetable[2] gridDefinitionTemplateNumber ('3.1.table',masterDir,localDir) =0 : dump,edition_specific;
meta gridDefinitionDescription codetable_title(gridDefinitionTemplateNumber);
alias isRotatedGrid = false;
if (gridDefinitionTemplateNumber >= 32768) {
template gridDefinitionSection "grib2/local/[centreForLocal]/template.3.[gridDefinitionTemplateNumber:l].def";
} else {
template gridDefinitionSection "grib2/templates/template.3.[gridDefinitionTemplateNumber:l].def";
}
if(PLPresent){
if(numberOfOctectsForNumberOfPoints == 1){
unsigned[1] pl[Nj] : dump;
}
if(numberOfOctectsForNumberOfPoints == 2){
unsigned[2] pl[Nj] : dump;
}
if(numberOfOctectsForNumberOfPoints == 3){
unsigned[3] pl[Nj] : dump;
}
alias geography.pl=pl;
}
when (PLPresent == 0) {
set numberOfOctectsForNumberOfPoints = 0;
set interpretationOfNumberOfPoints = 0;
}
section_padding section3Padding : read_only;
concept gridType {
"regular_ll" = { gridDefinitionTemplateNumber=0; PLPresent=0; }
"reduced_ll" = { gridDefinitionTemplateNumber=0; PLPresent=1; numberOfOctectsForNumberOfPoints=2;iDirectionIncrementGiven=0;numberOfPointsAlongAParallel = missing(); }
"rotated_ll" = { gridDefinitionTemplateNumber=1; PLPresent=0; }
"stretched_ll" = { gridDefinitionTemplateNumber=2; PLPresent=0; }
"stretched_rotated_ll" = { gridDefinitionTemplateNumber=3; PLPresent=0; }
"varres_ll" = { gridDefinitionTemplateNumber=4; PLPresent=0; }
"varres_rotated_ll" = { gridDefinitionTemplateNumber=5; PLPresent=0; }
"mercator" = { gridDefinitionTemplateNumber=10; PLPresent=0; }
"transverse_mercator" = { gridDefinitionTemplateNumber=12; PLPresent=0; }
"polar_stereographic" = { gridDefinitionTemplateNumber=20; PLPresent=0; }
"lambert" = { gridDefinitionTemplateNumber=30; PLPresent=0; }
"albers" = { gridDefinitionTemplateNumber=31; PLPresent=0; }
"regular_gg" = { gridDefinitionTemplateNumber=40; PLPresent=0; }
"reduced_gg" = { gridDefinitionTemplateNumber=40; PLPresent=1; numberOfOctectsForNumberOfPoints=2;iDirectionIncrementGiven=0;numberOfPointsAlongAParallel = missing(); }
"rotated_gg" = { gridDefinitionTemplateNumber=41; PLPresent=0; }
"reduced_rotated_gg" = { gridDefinitionTemplateNumber=41; PLPresent=1; numberOfOctectsForNumberOfPoints=2;iDirectionIncrementGiven=0;numberOfPointsAlongAParallel = missing(); }
"stretched_gg" = { gridDefinitionTemplateNumber=42; PLPresent=0; }
"reduced_stretched_gg" = { gridDefinitionTemplateNumber=42; PLPresent=1; numberOfOctectsForNumberOfPoints=2;iDirectionIncrementGiven=0;numberOfPointsAlongAParallel = missing(); }
"stretched_rotated_gg" = { gridDefinitionTemplateNumber=43; PLPresent=0; }
"reduced_stretched_rotated_gg" = { gridDefinitionTemplateNumber=43; PLPresent=1; numberOfOctectsForNumberOfPoints=2;iDirectionIncrementGiven=0;numberOfPointsAlongAParallel = missing(); }
# For consistency add the prefix regular_
"regular_rotated_gg" = { gridDefinitionTemplateNumber=41; PLPresent=0; } # = rotated_gg
"regular_stretched_gg" = { gridDefinitionTemplateNumber=42; PLPresent=0; } # = stretched_gg
"regular_stretched_rotated_gg" = { gridDefinitionTemplateNumber=43; PLPresent=0; } # = stretched_rotated_gg
"sh" = { gridDefinitionTemplateNumber=50; PLPresent=0;}
"rotated_sh" = { gridDefinitionTemplateNumber=51; PLPresent=0;}
"stretched_sh" = { gridDefinitionTemplateNumber=52; PLPresent=0;}
"stretched_rotated_sh" = { gridDefinitionTemplateNumber=53; PLPresent=0;}
"space_view" = { gridDefinitionTemplateNumber=90; PLPresent=0;}
"triangular_grid" = { gridDefinitionTemplateNumber=100;PLPresent=0;}
"unstructured_grid" = { gridDefinitionTemplateNumber=101;PLPresent=0;}
"equatorial_azimuthal_equidistant" = { gridDefinitionTemplateNumber=110; PLPresent=0;}
"azimuth_range" = { gridDefinitionTemplateNumber=120;PLPresent=0; }
"irregular_latlon" = { gridDefinitionTemplateNumber=130;PLPresent=0; }
"lambert_azimuthal_equal_area"= { gridDefinitionTemplateNumber=140;PLPresent=0; }
"cross_section" = { gridDefinitionTemplateNumber=1000;PLPresent=0; }
"Hovmoller" = { gridDefinitionTemplateNumber=1100;PLPresent=0; }
"time_section" = { gridDefinitionTemplateNumber=1200;PLPresent=0; }
"lambert_lam" = { gridDefinitionTemplateNumber=33; PLPresent=0; }
"mercator_lam" = { gridDefinitionTemplateNumber=13; PLPresent=0; }
"polar_stereographic_lam" = { gridDefinitionTemplateNumber=23; PLPresent=0; }
"lambert_bf" = { gridDefinitionTemplateNumber=63; PLPresent=0; }
"mercator_bf" = { gridDefinitionTemplateNumber=61; PLPresent=0; }
"polar_stereographic_bf" = { gridDefinitionTemplateNumber=62; PLPresent=0; }
"healpix" = { gridDefinitionTemplateNumber=150; PLPresent=0; }
"ncep_32769" = { centre=7; gridDefinitionTemplateNumber=32769; PLPresent=0; }
"unknown" = {PLPresent=0;}
"unknown_PLPresent" = {PLPresent=1;}
} : dump;
alias ls.gridType=gridType;
alias geography.gridType=gridType;
alias typeOfGrid=gridType;
meta md5Section3 md5(offsetSection3,section3Length);
alias md5GridSection = md5Section3;
meta projSourceString proj_string(gridType, 0): hidden;
meta projTargetString proj_string(gridType, 1): hidden;
alias projString = projTargetString : hidden;
constant isSpectral = !isGridded : constraint;
|