mirror of https://github.com/ecmwf/eccodes.git
134 lines
5.2 KiB
Modula-2
134 lines
5.2 KiB
Modula-2
# Horizontal Domain Template Component 4.1 - Latitude/longitude regular grid
|
|
|
|
# Ni - number of points along a parallel
|
|
unsigned[4] Ni : dump; # Note: This is for a REGULAR GRID so Ni cannot be missing
|
|
alias numberOfPointsAlongAParallel=Ni;
|
|
alias Nx = Ni;
|
|
alias geography.Ni=Ni;
|
|
|
|
# Nj - number of points along a meridian
|
|
unsigned[4] Nj : dump;
|
|
alias numberOfPointsAlongAMeridian=Nj;
|
|
alias Ny = Nj ;
|
|
alias geography.Nj=Nj;
|
|
|
|
# Basic angle of the initial production domain
|
|
unsigned[4] basicAngleOfTheInitialProductionDomain = 0;
|
|
transient mBasicAngle=basicAngleOfTheInitialProductionDomain*oneMillionConstant;
|
|
|
|
transient angleMultiplier = 1;
|
|
transient mAngleMultiplier = 1000000;
|
|
when (basicAngleOfTheInitialProductionDomain == 0) {
|
|
set angleMultiplier = 1;
|
|
set mAngleMultiplier = 1000000;
|
|
} else {
|
|
set angleMultiplier = basicAngleOfTheInitialProductionDomain;
|
|
set mAngleMultiplier = mBasicAngle;
|
|
}
|
|
|
|
# Subdivisions of basic angle used to define extreme longitudes and latitudes, and direction increments
|
|
unsigned[4] subdivisionsOfBasicAngle = missing() : can_be_missing;
|
|
|
|
transient angleDivisor = 1000000;
|
|
when (missing(subdivisionsOfBasicAngle) || subdivisionsOfBasicAngle == 0) {
|
|
set angleDivisor = 1000000;
|
|
} else {
|
|
set angleDivisor = subdivisionsOfBasicAngle;
|
|
}
|
|
|
|
# Note: Basic angle of the initial production domain and subdivisions of this basic angle are
|
|
# provided to manage cases where the recommended unit of 10^-6 degrees is not applicable
|
|
# to describe the extreme longitudes and latitudes, and direction increments.
|
|
# For these descriptors, the unit is equal to the ratio of the basic angle and the subdivisions number.
|
|
# For ordinary cases, zero and missing values should be coded, equivalent to respective values
|
|
# of 1 and 10^6 (10^-6 degrees unit)
|
|
|
|
# La1 - latitude of first grid point
|
|
signed[4] latitudeOfFirstGridPoint : edition_specific;
|
|
alias La1 = latitudeOfFirstGridPoint;
|
|
|
|
# Lo1 - longitude of first grid point
|
|
signed[4] longitudeOfFirstGridPoint ;
|
|
alias Lo1 = longitudeOfFirstGridPoint;
|
|
|
|
include "grib3/template.4.resolution_flags.def"
|
|
|
|
# La2 - latitude of last grid point
|
|
signed[4] latitudeOfLastGridPoint : edition_specific;
|
|
alias La2 = latitudeOfLastGridPoint;
|
|
|
|
# Lo2 - longitude of last grid point
|
|
signed[4] longitudeOfLastGridPoint : edition_specific;
|
|
alias Lo2 = longitudeOfLastGridPoint;
|
|
|
|
# Di - i direction increment
|
|
# Direction increments are unsigned and direction of increment is represented in the scanning mode
|
|
unsigned[4] iDirectionIncrement : can_be_missing,edition_specific;
|
|
alias Di = iDirectionIncrement;
|
|
alias Dx = iDirectionIncrement;
|
|
|
|
# Dj - j direction increment
|
|
# Direction increments are unsigned and direction of increment is represented in the scanning mode
|
|
unsigned[4] jDirectionIncrement : can_be_missing,edition_specific;
|
|
alias Dj = jDirectionIncrement;
|
|
alias Dy = jDirectionIncrement;
|
|
|
|
include "grib3/template.4.scanning_mode.def";
|
|
|
|
|
|
meta g2grid g2grid(
|
|
latitudeOfFirstGridPoint,
|
|
longitudeOfFirstGridPoint,
|
|
latitudeOfLastGridPoint,
|
|
longitudeOfLastGridPoint,
|
|
iDirectionIncrement,
|
|
jDirectionIncrement,
|
|
basicAngleOfTheInitialProductionDomain,
|
|
subdivisionsOfBasicAngle
|
|
);
|
|
|
|
meta geography.latitudeOfFirstGridPointInDegrees g2latlon(g2grid,0) : dump;
|
|
meta geography.longitudeOfFirstGridPointInDegrees g2latlon(g2grid,1) : dump;
|
|
meta geography.latitudeOfLastGridPointInDegrees g2latlon(g2grid,2) : dump;
|
|
meta geography.longitudeOfLastGridPointInDegrees g2latlon(g2grid,3) : dump;
|
|
|
|
alias xFirst=longitudeOfFirstGridPointInDegrees;
|
|
alias yFirst=latitudeOfFirstGridPointInDegrees;
|
|
alias xLast=longitudeOfLastGridPointInDegrees;
|
|
alias yLast=latitudeOfLastGridPointInDegrees;
|
|
|
|
meta geography.iDirectionIncrementInDegrees g2latlon(g2grid,4,
|
|
iDirectionIncrementGiven) : can_be_missing,dump;
|
|
|
|
meta geography.jDirectionIncrementInDegrees g2latlon(g2grid,5,
|
|
jDirectionIncrementGiven) : can_be_missing,dump;
|
|
|
|
alias latitudeFirstInDegrees = latitudeOfFirstGridPointInDegrees;
|
|
alias longitudeFirstInDegrees = longitudeOfFirstGridPointInDegrees;
|
|
alias latitudeLastInDegrees = latitudeOfLastGridPointInDegrees;
|
|
alias longitudeLastInDegrees = longitudeOfLastGridPointInDegrees;
|
|
alias DiInDegrees = iDirectionIncrementInDegrees;
|
|
alias DxInDegrees = iDirectionIncrementInDegrees;
|
|
alias DjInDegrees = jDirectionIncrementInDegrees;
|
|
alias DyInDegrees = jDirectionIncrementInDegrees;
|
|
|
|
#_if ( missing(Ni) && PLPresent == 1 ) {
|
|
# iterator latlon_reduced(numberOfPoints,missingValue,values,
|
|
# latitudeFirstInDegrees,longitudeFirstInDegrees,
|
|
# latitudeLastInDegrees,longitudeLastInDegrees,
|
|
# Nj,DjInDegrees,pl);
|
|
# nearest latlon_reduced(values,radius,Nj,pl,longitudeFirstInDegrees,longitudeLastInDegrees);
|
|
#} else {
|
|
# iterator latlon(numberOfPoints,missingValue,values,
|
|
# longitudeFirstInDegrees,DiInDegrees ,
|
|
# Ni,Nj,iScansNegatively,
|
|
# latitudeFirstInDegrees, DjInDegrees,jScansPositively,jPointsAreConsecutive);
|
|
# nearest regular(values,radius,Ni,Nj);
|
|
#}
|
|
meta latLonValues latlonvalues(values);
|
|
alias latitudeLongitudeValues=latLonValues;
|
|
meta latitudes latitudes(values,0);
|
|
meta longitudes longitudes(values,0);
|
|
meta distinctLatitudes latitudes(values,1);
|
|
meta distinctLongitudes longitudes(values,1);
|