1# Copyright 2005-2018 ECMWF.
2#
3# This software is licensed under the terms of the Apache Licence Version 2.0
4# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
5#
6# In applying this licence, ECMWF does not waive the privileges and immunities granted to it by
7# virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction.
8#
9
10# GRID DEFINITION quasi-regular latitude/longitude grid
11# grib 1 -> 2
12constant gridDefinitionTemplateNumber     = 0;
13
14unsigned[2] NRj : can_be_missing,dump;
15
16unsigned[2] numberOfPointsAlongAMeridian : can_be_missing,dump;
17alias Nj  = numberOfPointsAlongAMeridian;
18
19# Latitudes and Longitudes of the first and the last points
20# Resolution and component flags
21include "grib1/grid_first_last_resandcomp.def";
22
23unsigned[2] iDirectionIncrement : can_be_missing;
24unsigned[2] jDirectionIncrement : can_be_missing;
25alias Dj = jDirectionIncrement;
26alias Di = iDirectionIncrement;
27
28# for change_scanning_direction
29alias yFirst=latitudeOfFirstGridPointInDegrees;
30alias yLast=latitudeOfLastGridPointInDegrees;
31alias xFirst=longitudeOfFirstGridPointInDegrees;
32alias xLast=longitudeOfLastGridPointInDegrees;
33
34include "grib1/scanning_mode.def";
35
36#  Lar1 - latitude of first grid point of reference domain
37signed[3] Lar1 :  edition_specific;
38meta geography.Lar1InDegrees scale(latitudeOfFirstGridPointOfReferenceDomain,oneConstant,grib1divider,truncateDegrees) :dump;
39alias La1 = Lar1;
40
41#  Lor1 - longitude of first grid point of reference domain
42signed[3] Lor1  : edition_specific;
43meta geography.Lor1InDegrees scale(longitudeOfFirstGridPointOfReferenceDomain,oneConstant,grib1divider,truncateDegrees) : dump;
44alias Lo1 = Lor1;
45
46#  Lar2 - latitude of last grid point of reference domain
47signed[3] Lar2 :  edition_specific;
48meta geography.Lar2InDegrees scale(latitudeOfLastGridPointOfReferenceDomain,oneConstant,grib1divider,truncateDegrees) : dump;
49alias La2 = Lar2;
50
51#  Lor2 - longitude of last grid point of reference domain
52signed[3] Lor2 ;
53meta geography.Lor2InDegrees scale(longitudeOfLastGridPointOfReferenceDomain,oneConstant,grib1divider,truncateDegrees) : dump;
54alias Lo2 = Lor2;
55
56meta  geography.jDirectionIncrementInDegrees latlon_increment(ijDirectionIncrementGiven,jDirectionIncrement,
57  jScansPositively,
58  latitudeOfFirstGridPointInDegrees,latitudeOfLastGridPointInDegrees,
59  numberOfPointsAlongAMeridian,oneConstant,grib1divider,0) : can_be_missing,dump;
60#transient DjInMicrodegrees = times(jDirectionIncrement,thousand);
61
62meta  geography.iDirectionIncrementInDegrees latlon_increment(ijDirectionIncrementGiven,iDirectionIncrement,
63  iScansPositively,
64  longitudeOfFirstGridPointInDegrees,longitudeOfLastGridPointInDegrees,
65  Ni,oneConstant,grib1divider,1) : can_be_missing,dump;
66#meta DiInMicrodegrees times(iDirectionIncrement,thousand);
67
68alias latitudeFirstInDegrees = latitudeOfFirstGridPointInDegrees;
69alias longitudeFirstInDegrees = longitudeOfFirstGridPointInDegrees;
70
71alias latitudeLastInDegrees  = latitudeOfLastGridPointInDegrees;
72alias longitudeLastInDegrees = longitudeOfLastGridPointInDegrees;
73alias DiInDegrees = iDirectionIncrementInDegrees;
74alias DjInDegrees = jDirectionIncrementInDegrees;
75
76meta numberOfDataPoints number_of_points(Ni,Nj,PLPresent,pl) : dump;
77alias numberOfPoints=numberOfDataPoints;
78meta numberOfValues number_of_values(values,bitsPerValue,numberOfDataPoints,bitmapPresent,bitmap,numberOfCodedValues) : dump;
79#alias ls.valuesCount=numberOfValues;
80
81if(missing(Ni)){
82   iterator latlon_reduced(numberOfPoints,missingValue,values,
83      latitudeFirstInDegrees,longitudeFirstInDegrees,
84      latitudeLastInDegrees,loLast,
85      Nj,DjInDegrees,pl);
86   nearest latlon_reduced(values,radius,Nj,pl);
87} else {
88   iterator latlon(numberOfPoints,missingValue,values,longitudeFirstInDegrees,iInc ,
89                   Ni,Nj,iScansNegatively ,
90                   latitudeFirstInDegrees,DjInDegrees,jScansPositively );
91   nearest regular(values,radius,Ni,Nj);
92}
93meta latLonValues latlonvalues(values);
94alias latitudeLongitudeValues=latLonValues;
95meta latitudes latitudes(values,0);
96meta longitudes longitudes(values,0);
97meta distinctLatitudes latitudes(values,1);
98meta distinctLongitudes longitudes(values,1);
99
100# END   1/grid_definition.latitude_longitude_grid ----------------------------------------------------------------------
101