# Copyright 2005-2018 ECMWF.
#
# This software is licensed under the terms of the Apache Licence Version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
# 
# In applying this licence, ECMWF does not waive the privileges and immunities granted to it by
# virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction.
#

include "grib2/template.3.grid.def";

#  Di - i direction increment

unsigned[4] iDirectionIncrement : can_be_missing,edition_specific;
alias Di =  iDirectionIncrement;
alias Dx =  iDirectionIncrement;

#  Dj - j direction increment

unsigned[4] jDirectionIncrement : can_be_missing,edition_specific;
alias Dj =  jDirectionIncrement;
alias Dy =  jDirectionIncrement;

include "grib2/template.3.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);

