/** @file
 *  @author Gilbert @date 2002-10-26
 *
 *  This Fortran Module contains info on all the available 
 *   GRIB2 Data Representation Templates used in Section 5 (DRS).
 *   The information decribing each template is stored in the
 *   drstemplate structure defined below.
 *
 *   Each Template has three parts: The number of entries in the template
 *   (mapdrslen);  A map of the template (mapdrs), which contains the
 *   number of octets in which to pack each of the template values; and
 *   a logical value (needext) that indicates whether the Template needs 
 *   to be extended.  In some cases the number of entries in a template 
 *   can vary depending upon values specified in the "static" part of 
 *   the template.  ( See Template 5.1 as an example )
 *
 *   NOTE:  Array mapdrs contains the number of octets in which the 
 *   corresponding template values will be stored.  A negative value in
 *   mapdrs is used to indicate that the corresponding template entry can
 *   contain negative values.  This information is used later when packing
 *   (or unpacking) the template data values.  Negative data values in GRIB
 *   are stored with the left most bit set to one, and a negative number
 *   of octets value in mapdrs[] indicates that this possibility should
 *   be considered.  The number of octets used to store the data value
 *   in this case would be the absolute value of the negative value in 
 *   mapdrs[].
 */
#ifndef _drstemplates_H
#define _drstemplates_H
#include "grib2.h"
      #define MAXDRSTEMP 9              // maximum number of templates
      #define MAXDRSMAPLEN 200          // maximum template map length

      struct drstemplate
      {
          g2int template_num;
          g2int mapdrslen;
          g2int needext;
          g2int mapdrs[MAXDRSMAPLEN];
      };

      const struct drstemplate templatesdrs[MAXDRSTEMP] = {
             // 5.0: Grid point data - Simple Packing
         { 0, 5, 0, {4,-2,-2,1,1} },
             // 5.2: Grid point data - Complex Packing
         { 2, 16, 0, {4,-2,-2,1,1,1,1,4,4,4,1,1,4,1,4,1} },
             // 5.3: Grid point data - Complex Packing and spatial differencing
         { 3, 18, 0, {4,-2,-2,1,1,1,1,4,4,4,1,1,4,1,4,1,1,1} },
             // 5.50: Spectral Data - Simple Packing
         { 50, 5, 0, {4,-2,-2,1,4} },
             // 5.51: Spherical Harmonics data - Complex packing 
         { 51, 10, 0, {4,-2,-2,1,-4,2,2,2,4,1} },
//           // 5.1: Matrix values at gridpoint - Simple packing
//         { 1, 15, 1, {4,-2,-2,1,1,1,4,2,2,1,1,1,1,1,1} },
             // 5.40: Grid point data - JPEG2000 encoding
         { 40, 7, 0, {4,-2,-2,1,1,1,1} },
             // 5.41: Grid point data - PNG encoding
         { 41, 5, 0, {4,-2,-2,1,1} },
             // 5.40000: Grid point data - JPEG2000 encoding
         { 40000, 7, 0, {4,-2,-2,1,1,1,1} },
             // 5.40010: Grid point data - PNG encoding
         { 40010, 5, 0, {4,-2,-2,1,1} }
      } ;


#endif  /*  _drstemplates_H  */
