Use PDEF For Displaying Pre-Projected Data With GrADS

Display pre-projected data with PDEF
PDEF Syntax
How grid interpolation works
How wind rotation works
PDEF BILIN option
PDEF GENERAL option
PDEF FILE option

Display Pre-Projected Data with PDEF

Gridded data that are mapped onto a particular map projection are called 'pre-projected.' An example of pre-projected data is the output from a weather forecast model that is mapped onto a north polar stereographic grid.

In order to display pre-projected data on a map in GrADS, the descriptor file must contain a PDEF entry. A descriptor file that contains a PDEF record describes two different grids. The first grid is described by the PDEF record itself and is the "native" grid for the pre-projected data in the file. The second grid described in the desctiptor file is a rectilinear lat/lon grid, which is defined by the XDEF and YDEF records. The PDEF record describes the size of the native grid, and then describes how to convert from i/j of the native grid to the lat/lon values of the rectilinear grid described by XDEF and YDEF. The information in the PDEF entry describes the projection of the grid along with the projection constants or providing the mapping to the native grid in a supplementary data file. The rectilinear grid is used by GrADS internally and can be any size or resolution -- it is completely independent of the pre-projected or native grid. GrADS uses the information about the two grids to interpolate from the PDEF-described native grid to the XDEF/ YDEF-described rectilinear grid. All displays and analyses are done using the interpolated data on the rectilinear grid. The virtue of this approach is that all built in GrADS analytic functions (e.g., aave, hcurl...) will work even though the data were not originally on a lon/lat grid. The downside is that you are looking at interpolated data.

It is possible to view the pre-projected data on its native grid. To do this, you omit the PDEF entry from the descriptor file, and use the XDEF and YDEF entries to describe the shape of the native grid. In this case, your displays must be drawn in i/j space without a map projection (set mpdraw off).

When you do a display of a pre-projected vector field, you must know whether the original vector components are defined relative to the data grid or relative to the Earth. If the data are grid-relative, they must be rotated to Earth-relative coordinates in order for the interpolation to work properly. See the "Notes" under each particular projection type for further information.

PDEF Syntax

PDEF isize jsize NPS ipole jpole lonref gridinc PDEF isize jsize SPS ipole jpole lonref gridinc
Example: | PDEF 53 45 nps 27 49 -105 190.5

Args:

isize | The size of the native grid in the x direction
jsize | The size of the native grid in the y direction
ipole | the i coordinate of the pole referenced from the lower left corner, assumed to be at (1,1)
jpole | the j coordinate of the pole referenced from the lower left corner, assumed to be at (1,1)
lonref | reference longitude
gridinc | distance between gripoints in km

Notes: | Polar stereographic projections (N and S) are defined as at NCEP. Wind rotation has also been added so that vector data will be properly displayed.
PDEF isize jsize LCCR latref lonref iref jref Struelat Ntruelat slon dx dy PDEF isize jsize LCC latref lonref iref jref Struelat Ntruelat slon dx dy
Example: | PDEF 103 69 lccr 30 -88 51.5 34.5 20 40 -88 90000 90000

Args:

isize | The size of the native grid in the x direction
jsize | The size of the native grid in the y direction
latref | reference latitude
lonref | reference longitude (in degrees, E is positive, W is negative)
iref | i of ref point
jref | j of ref point
Struelat | S true lat
Ntruelat | N true lat
slon | standard longitude
dx | grid X increment in meters
dy | grid Y increment in meters

Notes: | Starting with version 1.9b4, the LCCR option supplements the use of PDEF with data on the Lambert Conformal projection. With LCCR, wind rotation has been implemented for data files with grid-relative winds instead of Earth-relative winds. Use LCC if your vector components are already Earth-relative.
PDEF isize jsize ETA.U lonref latref dlon dlat
Example: | PDEF 181 136 eta.u -97.0 41.0 0.38888888 0.37

Args:

isize | The size of the native grid in the x direction
jsize | The size of the native grid in the y direction
lonref | reference longitude (in degrees, E is positive, W is negative)
latref | reference latitude
dlon | grid longitude increment in degrees
dlat | grid latitude increment in degrees

Notes: | The eta model native grid is awkward to work with because the variables are on staggered and non-rectangular grids. NCEP created "unstaggered" eta model fields, in which the variables are placed on a common rectangular grid. Wind rotation has also been added so that vector data will be properly displayed.
PDEF isize jsize PSE slat slon ipole jpole dx dy sign
Example: |

Args:

isize | The size of the native grid in the x direction
jsize | The size of the native grid in the y direction
slat | absolute value of the standard latitude
slon | absolute value of the standard longitude
ipole | the i coordinate of the pole referenced from the lower left corner, assumed to be at (0,0)
jpole | the j coordinate of the pole referenced from the lower left corner, assumed to be at (0,0)
dx | grid X increment in km
dy | grid Y increment in km
sign | 1 for NH; -1 for SH

Notes: | The polar stereo projection used by the original NMC models is not very precise because it assumes the earth is round (eccentricity = 0). While this approximation was reasonable for coarse resolution NWP models, it is inadequate to work with higher resolution data such as SSM/I. Wind rotation has not been implemented!!! Use only for scalar fields.
PDEF isize jsize OPS latref lonref xoff yoff iref jref dx dy
Example: | PDEF 26 16 ops 40.0 -100.0 90000.0 90000.0 14.0 9.0 180000.0 180000.0

Args:

isize | The size of the native grid in the x direction
jsize | The size of the native grid in the y direction
latref | reference latitude
lonref | reference longitude (in degrees, E is positive, W is negative)
xoff | lonref offset in meters
yoff | latref offset in meters
iref | the i coordinate of the reference point
jref | the j coordinate of the reference point
dx | grid X increment in km
dy | grid Y increment in km
dy | grid Y increment in km

Notes: | The CSU RAMS model uses an oblique polar stereo projection. Wind rotation has not been implemented!!! Use only for scalar fields.
PDEF isize jsize ROTLL lonpol latpol dlon dlat lonll latll PDEF isize jsize ROTLLR lonpol latpol dlon dlat lonll latll
Example: | PDEF 500 330 rotllr -170.0 43.0 0.02 0.02 -5.5 -3.8

Args:

isize | The size of the native grid in the x direction
jsize | The size of the native grid in the y direction
lonpol | Longitude of the rotated pole in degrees
latpol | Latitude of the rotated pole in degrees
dlon | grid spacing in longitudinal direction of the rotated grid in degrees
dlat | grid spacing in latitudinal direction of the rotated grid in degrees
lonll | longitude of the lower left corner, given in rotated space in degree
latll | latitude of the lower left corner, given in rotated space in degree

Notes: | (GrADS version 2.0) The rotated lat/lon grid projection is described in the COSMO documentation, Chapter 3.3. The lower left corner, i.e. the first element in the data array, has to be the southwest corner. It is not possible to use a mirrored grid by setting dlon or dlat to a negative value.
PDEF isize jsize BILIN format byteorder fname
Example: | PDEF 100 100 BILIN sequential binary-big ^mygrid.interp.values

Args:

isize | The size of the native grid in the x direction
jsize | The size of the native grid in the y direction
format | Must be either STREAM (direct access) or SEQENTIAL (fortran formatted)
byteorder | If set to BINARY, byte odering is assumed to be same as local machine If set to BINARY-BIG, byte ordering is assumed to be big-endian If set to BINARY-LITTLE, byte ordering is assumed to be little-endian
fname | The name of the supplementary file

Notes: | The supplementary file contains three lat-lon floating-point grids: i values, j values, and wind rotation values. The native grid is assumed to have a corner (i,j) value of (1,1). The size of these grids must match the XDEF and YDEF entries in the descriptor file.
PDEF isize jsize GENERAL num format byteorder fname
Example: | PDEF 182 149 general 4 sequential binary-big ^mygrid.interp.values PDEF 15238 1 general 1 stream binary ^gtd.filepdef

Args:

isize | The size of the native grid in the x direction
jsize | The size of the native grid in the y direction
num | number of sets of interpolation grids supplied
format | Must be either STREAM (direct access) or SEQENTIAL (fortran formatted)
byteorder | If set to BINARY, byte odering is assumed to be same as local machine If set to BINARY-BIG, byte ordering is assumed to be big-endian If set to BINARY-LITTLE, byte ordering is assumed to be little-endian
fname | The name of the supplementary file; it may be mixed case.

Notes:

(GrADS version 2.0.a3 and later) The syntax and behavior of PDEF GENERAL is exactly like PDEF FILE, except that the convention for the native grid offset values in the pdef file is the same for all data formats. The offsets should be 1-based; the first grid point is assumed to have (i,j) values of (1,1), and valid offset values are > 0 and <= isize*jsize .

Native grid offset values of -999 indicate not to use an input point for that portion of the calculation (thus you can apply less than the "num" number of interpolation points for some of the points).

See additional notes in the paragraphs below.

PDEF isize jsize FILE num format byteorder fname
Example: | PDEF 182 149 file 4 sequential binary-big ^mygrid.interp.values PDEF 15238 1 file 1 stream binary ^gtd.filepdef

Args:

isize | The size of the native grid in the x direction
jsize | The size of the native grid in the y direction
num | number of sets of interpolation grids supplied
format | Must be either STREAM (direct access) or SEQENTIAL (fortran formatted)
byteorder | If set to BINARY, byte odering is assumed to be same as local machine If set to BINARY-BIG, byte ordering is assumed to be big-endian If set to BINARY-LITTLE, byte ordering is assumed to be little-endian
fname | The name of the supplementary file; it may be mixed case.

Notes:

For GrADS v2.0.a2 and earlier, jsize was fixed to be 1, and isize was the size of the native grid expressed as a vector (i.e., all gridpoints in the x-y grid). This mode for describing the native grid will continue to work with v2.0.a3+, but only if the native grid is in GRIB or binary format. For NetCDF and HDF formats, the isize and jsize args must match the X and Y dimensions of the native grid.

WARNING: The use of PDEF FILE may be incorrect! A long-standing bug and incomplete documentation has led to different conventions for the native grid offset values in the pdef file for GRIB and non-GRIB data formats. For GRIB (1&2), the offsets must be 0-based; the first grid point is assumed to have (i,j) values of (0,0). For all other data types, the offsets must be 1-based; the first grid point is assumed to have (i,j) values of (1,1). Thus:
for GRIB format: valid offset values are >= 0 and < isize*jsize
for other formats: valid offset values are > 0 and <= isize*jsize
To maintain backward compatibility, the bug will remain in GrADS as a feature, but the use of PDEF FILE has been deprecated as of version 2.0.a3 and a warning message will be displayed when a data set is opened that uses PDEF FILE. Note that if you use grib2ctl or g2ctl to generate your pdef file, the offsets are correct.

Native grid offset values of -999 indicate not to use an input point for that portion of the calculation (thus you can apply less than the "num" number of interpolation points for some of the points).

See additional notes in the paragraphs below.

How PDEF Grid Interpolation Works
To illustrate how the data is interpolated from the native grid to the rectilinear grid, let's consider an example. Here are a set of relevant records from a descriptor file:
PDEF 100 100 nps ...
XDEF 181 linear -180 1
YDEF 90 linear 0 1
These three entries describe data on a native 100x100 North Polar stereographic projection and a rectilinear lat/lon grid that is 181 by 90 and has an interval of 1 degree in both lat and lon. Consider one point within the rectilinear grid, the point -90,40. GrADS calls an internal routine to calculate the i and j values in the native grid that correspond to this lat/lon point. Let's say we get i,j values of 31.24 and 67.88. To do the interpolation to the lat/lon point -90,40, GrADS uses the data values from the following four native grid points: 31,67 - 31,68 - 32,67 - 32,68. Bi-linear interpolation is used within this grid box to get down to the position 31.24,67.88. The interpolation is linear within the i,j grid. When a descriptor file is opened that contains a PDEF record, GrADS calculates the i/j values in the native grid that correspond to the lat/lon pair for each gridpoint in the rectilinear grid.

How PDEF Wind Rotation Works
There is a third value calculated for every lat/lon point, and that is the wind rotation value. With some "pre-projected" or native grids, the winds are given relative to the i/j space and not the lat/lon space. To insure correct interpolation, the winds must be rotated to lat/lon space. This is done by determining a rotation amount for each lat/lon point. When u or v wind components are displayed, the values are not just interpolated but also rotated.

To do the wind rotation properly, GrADS requires both the u and v components. Even if you are just displaying u, GrADS has to retrieve (internally) both the u and v component in order to do the rotation calculation. GrADS determines how to match u and v variables by checking the units field of the variable record in the descriptor file. The u variable must have a units value of 33, and the v variable must have a units value of 34. (This is the GRIB convention). If there are more than one u/v pairs, secondary units values are used. For example:

u | 18 | 33,100 | U-Wind Components on Pressure Levels
v | 18 | 34,100 | V-Wind Components on Pressure Levels
u10 | 0 | 33,105 | 10 Meter U Wind
v10 | 0 | 34,105 | 10 Meter V Wind

might be some variable records in the descriptor file. If wind rotation is called for, u and v would be paired, and u10 and v10 would be paired (since the secondary values would be checked, ie, the 105,100 values).

The PDEF BILIN Option
When a descriptor file is opened that contains a PDEF record, we have explained that GrADS internally generates three grids, each one the size of the rectilinear lat/lon grid. The first two grids contain the i and j values (respectively) from the native grid that correspond to each grid point in the rectilinear grid; the third grid contains wind rotation values. But this only works for a small set of well-defined native grids. GrADS will generate these three internal grids automatically for polar stereographic, lamber conformal, and some eta grids. If the native grid for your data is not one of the predefined projections, it is still possible for GrADS to handle the data. All you have to do is supply these three grids to GrADS with a supplementary data file and use the bilin option in your PDEF record.

The supplementary file will contains three lat-lon floating-point grids sized according to the XDEF and YDEF records in the descriptor file.The three grids contain: i values, j values, and wind rotation values. A value of -999 in the i-value grid indicates not to interpolate to that lat-lon point (will end up missing on output) and a value of -999 in the wind-rotation grid indicates not to do wind rotation for that point. If the wind-rotation grid is all -999 values, no rotation is ever done and a flag is set not to even attempt rotation.

The PDEF GENERAL Option (and the PDEF FILE option)
All of the PDEF examples discussed so far involve the same method for grid interpolation: a grid point value in the rectilinear grid is calculated by finding the four neighboring grid points in the native grid and averaging them, with weights applied bi-linearly according to their proximity to the to rectilinear grid point. The PDEF GENERAL option and the PDEF FILE option generalize this method so that an arbitrary number of native grid point values and their weights are averaged to generate the interpolated rectilinear grid point values. The index values for the native grid values that are to be used and their weights are specified by the user in a supplementary data file (fname). The FILE and GENERAL options are identical except for one detail: they have different conventions for the native grid offset values in the supplementary file (see the "Notes" in the syntax tables above for specifics).

The num argument in the PDEF FILE entry specifies the number of native grid points that will be used to calcuate each interpolated rectilinear grid point value. For each num, the supplementary data file will contain two grids -- both will be the size of the rectilinear grid (as defined by XDEF and YDEF). The first grid contains the index or offset values that point to the native grid value that will be used in the interpolation; the second grid contains the weights for those native grid values. The first grid contains integer values, the second grid contains floating-point values. Finally, the supplementary data file must also contain one grid of floating-point wind rotation values. Thus if num equals 1, there will be 3 grids in fname. If num equals 3, there will be 7 grids in fname (3 sets of 2 grids plus the wind rotation grid).

To do the grid interpolation, GrADS will first read the data in the native grid (vector) along with the values in the supplementary grids. To calculate the interpolated value for a particular lat-lon point, GrADS will get num native grid point values, multiply each by their weight, sum over all the weighted native grid points, and divide by the sum of the weights.

An Example:

The original data are set up as a vector of land points only, taken from a 1-degree lat/lon grid. There are 15238 land points in the native grid (vector). We use the PDEF FILE option to repopulate a rectilinear lat/lon grid with the land values, leaving the ocean grid points as missing. In this case, ther eis no interpolation done. The PDEF option is used simply to convert a vector of land points into a 2D grid with ocean points missing. The descriptor file looks like this:

DSET ^gswp_vegetation_parameters.nc
DTYPE netcdf
TITLE Monthly Vegetation parameters at 1x1 degree
UNDEF 1.e+20
PDEF 15238 1 file 1 stream binary ^gswp.filepdef
XDEF 360 linear -179.5 1
YDEF 150 linear -59.5 1
ZDEF 1 linear 1 1
TDEF 204 linear 00Z01jan1982 1mo
VARS 1
NDVI=>ndvi 0 t,x Monthly vegetation index
ENDVARS

The supplementary file gtd.filepdef contains three grids -- the first contains the index values that associate each location in the lat/lon grid with it's point in the vector. All of the ocean points will have a missing value of -999. The second grid will contain the weights, which will be 1 for land points, 0 for ocean points. The third grid will contain all missing values since wind rotation is not a issue in this example. Here is a descriptor file for the supplementary data file (a useful strategy for making sure you've got everything written out correctly):

DSET ^gswp.filepdef
TITLE PDEF file for GSWP Vegetation Parameters
UNDEF -999
XDEF 360 linear -179.5 1
YDEF 150 linear -59.5 1
ZDEF 1 linear 1 1
TDEF 1 linear 00z01jul1982 3hr
VARS 3
i 0 -1,40,4 Index Values
w 0 99 Weights
r 0 99 Wind Rotation Values
ENDVARS