NCEPLIBS-g2c  1.7.0
pdstemplates.c
Go to the documentation of this file.
1 
41 #include <stdlib.h>
42 #include "grib2_int.h"
43 
44 #define MAXPDSTEMP 47
45 #define MAXPDSMAPLEN 200
50 struct pdstemplate
51 {
52  g2int template_num;
53  g2int mappdslen;
54  g2int needext;
55  g2int mappds[MAXPDSMAPLEN];
56 };
57 
61 static const struct pdstemplate templatespds[MAXPDSTEMP] =
62 {
65  {0,15,0, {1,1,1,1,1,2,1,1,-4,1,-1,-4,1,-1,-4} },
68  {1,18,0, {1,1,1,1,1,2,1,1,-4,1,-1,-4,1,-1,-4,1,1,1} },
71  {2,17,0, {1,1,1,1,1,2,1,1,-4,1,-1,-4,1,-1,-4,1,1} },
74  {3,31,1, {1,1,1,1,1,2,1,1,-4,1,-1,-4,1,-1,-4,1,1,1,1,1,1,1,-4,-4,4,4,1,-1,4,-1,4} },
77  {4,30,1, {1,1,1,1,1,2,1,1,-4,1,-1,-4,1,-1,-4,1,1,1,1,1,1,1,-4,4,4,1,-1,4,-1,4} },
80  {5,22,0, {1,1,1,1,1,2,1,1,-4,1,-1,-4,1,-1,-4,1,1,1,-1,-4,-1,-4} },
83  {6,16,0, {1,1,1,1,1,2,1,1,-4,1,-1,-4,1,-1,-4,1} },
86  {7,15,0, {1,1,1,1,1,2,1,1,-4,1,-1,-4,1,-1,-4} },
89  {8,29,1, {1,1,1,1,1,2,1,1,-4,1,-1,-4,1,-1,-4,2,1,1,1,1,1,1,4,1,1,1,4,1,4} },
92  {9,36,1, {1,1,1,1,1,2,1,1,-4,1,-1,-4,1,-1,-4,1,1,1,-1,-4,-1,-4,2,1,1,1,1,1,1,4,1,1,1,4,1,4} },
95  {10,30,1, {1,1,1,1,1,2,1,1,-4,1,-1,-4,1,-1,-4,1,2,1,1,1,1,1,1,4,1,1,1,4,1,4} },
98  {11,32,1, {1,1,1,1,1,2,1,1,-4,1,-1,-4,1,-1,-4,1,1,1,2,1,1,1,1,1,1,4,1,1,1,4,1,4} },
101  {12,31,1, {1,1,1,1,1,2,1,1,-4,1,-1,-4,1,-1,-4,1,1,2,1,1,1,1,1,1,4,1,1,1,4,1,4} },
104  {13,45,1, {1,1,1,1,1,2,1,1,-4,1,-1,-4,1,-1,-4,1,1,1,1,1,1,1,-4,-4,4,4,1,-1,4,-1,4,2,1,1,1,1,1,1,4,1,1,1,4,1,4} },
107  {14,44,1, {1,1,1,1,1,2,1,1,-4,1,-1,-4,1,-1,-4,1,1,1,1,1,1,1,-4,4,4,1,-1,4,-1,4,2,1,1,1,1,1,1,4,1,1,1,4,1,4} },
110  {15,18,0, {1,1,1,1,1,2,1,1,-4,1,-1,-4,1,-1,-4,1,1,1} },
112  {20,19,0, {1,1,1,1,1,-4,4,2,4,2,1,1,1,1,1,2,1,3,2} },
114  {30,5,1, {1,1,1,1,1} },
116  {31,5,1, {1,1,1,1,1} },
119  {40,16,0, {1,1,2,1,1,1,2,1,1,-4,1,-1,-4,1,-1,-4} },
122  {41,19,0, {1,1,2,1,1,1,2,1,1,-4,1,-1,-4,1,-1,-4,1,1,1} },
126  {42,30,1, {1,1,2,1,1,1,2,1,1,-4,1,-1,-4,1,-1,-4,2,1,1,1,1,1,1,4,1,1,1,4,1,4} },
130  {43,33,1, {1,1,2,1,1,1,2,1,1,-4,1,-1,-4,1,-1,-4,1,1,1,2,1,1,1,1,1,1,4,1,1,1,4,1,4} },
132  {254,3,0, {1,1,4} },
135  {1000,9,0, {1,1,1,1,1,2,1,1,-4} },
138  {1001,16,0, {1,1,1,1,1,2,1,1,4,4,1,1,1,4,1,4} },
141  {1002,15,0, {1,1,1,1,1,2,1,1,-4,1,1,1,4,4,2} },
144  {1100,15,0, {1,1,1,1,1,2,1,1,-4,1,-1,-4,1,-1,-4} },
147  {1101,22,0, {1,1,1,1,1,2,1,1,-4,1,-1,-4,1,-1,-4,4,1,1,1,4,1,4} },
149  {32,10,1, {1,1,1,1,1,2,1,1,-2,1} },
152  {44,21,0, {1,1,2,1,-1,-4,-1,-4,1,1,1,2,1,1,-2,1,-1,-4,1,-1,-4} },
156  {45,24,0, {1,1,2,1,-1,-4,-1,-4,1,1,1,2,1,1,-4,1,-1,-4,1,-1,-4,1,1,1} },
160  {46,35,1, {1,1,2,1,-1,-4,-1,-4,1,1,1,2,1,1,-4,1,-1,-4,1,-1,-4,2,1,1,1,1,1,1,4,1,1,1,4,1,4} },
164  {47,38,1, {1,1,1,2,1,-1,-4,-1,-4,1,1,2,1,1,-4,1,-1,-4,1,-1,-4,1,1,1,2,1,1,1,1,1,1,4,1,1,1,4,1,4} },
168  {48,26,0, {1,1,2,1,-1,-4,-1,-4,1,-1,-4,-1,-4,1,1,1,2,1,1,-4,1,-1,-4,1,-1,-4} },
169 
173  {50,21,0, {1,1,1,1,1,2,1,1,-4,1,-1,-4,1,-1,-4,1,1,4,4,4,4} },
174 
178  {52,15,0, {1,1,1,1,1,1,1,1,2,1,1,-4,1,-1,-4} },
179 
182  {51,16,1, {1,1,1,1,1,2,1,1,-4,1,-1,-4,1,-1,-4,1} },
183 
187  {91,36,1, {1,1,1,1,1,2,1,1,-4,1,-1,-4,1,-1,-4,1,1,1,-1,-4,-1,-4,2,1,1,1,1,1,1,4,1,1,1,4,1,4} },
192  {33,18,1, {1,1,1,1,1,2,1,1,-4,1,2,2,2,-1,-4,1,1,1} },
197  {34,32,1, {1,1,1,1,1,2,1,1,-4,1,2,2,2,-1,-4,1,1,1,2,1,1,1,1,1,1,4,1,1,1,4,1,4} },
202  {53,19,1, {1,1,1,1,4,2,1,1,1,2,1,1,-4,1,-1,-4,1,-1,-4} },
207  {54,22,1, {1,1,1,1,4,2,1,1,1,2,1,1,-4,1,-1,-4,1,-1,-4,1,1,1} },
213  {57,7,1, {1,1,2,2,2,2,1} },
218  {60,24,0, {1,1,1,1,1,2,1,1,-4,1,-1,-4,1,-1,-4,1,1,1,2,1,1,1,1,1} },
223  {61,38,1, {1,1,1,1,1,2,1,1,-4,1,-1,-4,1,-1,-4,1,1,1,2,1,1,1,1,1,2,1,1,1,1,1,1,4,1,1,1,4,1,4} },
229  {35,6,1, {1,1,1,1,1,1} }
230 
231 } ;
232 
245 static g2int
247 {
248  g2int j, getpdsindex = -1;
249 
250  for (j = 0; j < MAXPDSTEMP; j++)
251  {
252  if (number == templatespds[j].template_num)
253  {
254  getpdsindex = j;
255  return getpdsindex;
256  }
257  }
258 
259  return getpdsindex;
260 }
261 
280 gtemplate *
282 {
283  g2int index;
284  gtemplate *new;
285 
286  index = getpdsindex(number);
287 
288  if (index != -1)
289  {
290  new = malloc(sizeof(gtemplate));
291  new->type = 4;
292  new->num = templatespds[index].template_num;
293  new->maplen = templatespds[index].mappdslen;
294  new->needext = templatespds[index].needext;
295  new->map = (g2int *)templatespds[index].mappds;
296  new->extlen = 0;
297  new->ext = NULL;
298  return new;
299  }
300  else {
301  printf("getpdstemplate: PDS Template 4.%d not defined.\n", (int)number);
302  return NULL;
303  }
304 
305  return NULL;
306 }
307 
328 gtemplate *
329 extpdstemplate(g2int number, g2int *list)
330 {
331  gtemplate *new;
332  g2int index, i, j, k, l;
333 
334  index = getpdsindex(number);
335  if (index == -1)
336  return NULL;
337 
338  new = getpdstemplate(number);
339 
340  if (!new->needext)
341  return new;
342 
343  if (number == 3)
344  {
345  new->extlen = list[26];
346  new->ext = malloc(sizeof(g2int) * new->extlen);
347  for (i = 0; i < new->extlen; i++)
348  {
349  new->ext[i] = 1;
350  }
351  }
352  else if (number == 4)
353  {
354  new->extlen = list[25];
355  new->ext = malloc(sizeof(g2int) * new->extlen);
356  for (i = 0; i < new->extlen; i++)
357  {
358  new->ext[i] = 1;
359  }
360  }
361  else if (number == 8)
362  {
363  if (list[21] > 1)
364  {
365  new->extlen = (list[21] - 1) * 6;
366  new->ext = malloc(sizeof(g2int) * new->extlen);
367  for (j = 2; j <= list[21]; j++)
368  {
369  l = (j - 2) * 6;
370  for (k = 0; k < 6; k++)
371  {
372  new->ext[l+k] = new->map[23 + k];
373  }
374  }
375  }
376  }
377  else if (number == 9)
378  {
379  if (list[28] > 1)
380  {
381  new->extlen = (list[28] - 1) * 6;
382  new->ext = malloc(sizeof(g2int) * new->extlen);
383  for (j = 2; j <= list[28]; j++)
384  {
385  l = (j - 2) * 6;
386  for (k = 0; k < 6; k++)
387  {
388  new->ext[l + k] = new->map[30 + k];
389  }
390  }
391  }
392  }
393  else if (number == 10)
394  {
395  if (list[22] > 1)
396  {
397  new->extlen = (list[22] - 1) * 6;
398  new->ext = (g2int *)malloc(sizeof(g2int)*new->extlen);
399  for (j = 2; j <= list[22]; j++)
400  {
401  l = (j - 2) * 6;
402  for (k = 0; k < 6; k++)
403  {
404  new->ext[l + k] = new->map[24 + k];
405  }
406  }
407  }
408  }
409  else if (number == 11)
410  {
411  if (list[24] > 1)
412  {
413  new->extlen = (list[24] - 1) * 6;
414  new->ext = malloc(sizeof(g2int) * new->extlen);
415  for (j = 2; j <= list[24]; j++)
416  {
417  l = (j - 2) * 6;
418  for (k = 0; k < 6; k++)
419  {
420  new->ext[l + k] = new->map[26 + k];
421  }
422  }
423  }
424  }
425  else if (number == 12)
426  {
427  if (list[23] > 1)
428  {
429  new->extlen = (list[23] - 1) * 6;
430  new->ext = malloc(sizeof(g2int) * new->extlen);
431  for (j = 2; j <= list[23]; j++)
432  {
433  l = (j - 2) * 6;
434  for (k = 0; k < 6; k++)
435  {
436  new->ext[l + k] = new->map[25 + k];
437  }
438  }
439  }
440  }
441  else if (number == 13)
442  {
443  new->extlen = ((list[37] - 1) * 6) + list[26];
444  new->ext = malloc(sizeof(g2int) * new->extlen);
445  if (list[37] > 1)
446  {
447  for (j = 2; j <= list[37]; j++)
448  {
449  l = (j - 2) * 6;
450  for (k = 0; k < 6; k++)
451  {
452  new->ext[l + k] = new->map[39 + k];
453  }
454  }
455  }
456  l = (list[37] - 1) * 6;
457  if (l < 0)
458  l = 0;
459  for (i = 0; i < list[26]; i++)
460  {
461  new->ext[l+i] = 1;
462  }
463  }
464  else if (number == 14)
465  {
466  new->extlen = ((list[36] - 1) * 6) + list[25];
467  new->ext = malloc(sizeof(g2int) * new->extlen);
468  if (list[36] > 1)
469  {
470  for (j = 2; j <= list[36]; j++)
471  {
472  l = (j - 2) * 6;
473  for (k = 0; k < 6; k++)
474  {
475  new->ext[l + k] = new->map[38 + k];
476  }
477  }
478  }
479  l = (list[36] - 1) * 6;
480  if (l < 0)
481  l = 0;
482  for (i = 0; i < list[25]; i++)
483  {
484  new->ext[l + i] = 1;
485  }
486  }
487  else if (number == 30)
488  {
489  new->extlen = list[4] * 5;
490  new->ext = malloc(sizeof(g2int) * new->extlen);
491  for (i = 0;i < list[4]; i++)
492  {
493  l = i * 5;
494  new->ext[l] = 2;
495  new->ext[l + 1] = 2;
496  new->ext[l + 2] = 1;
497  new->ext[l + 3] = 1;
498  new->ext[l + 4] = 4;
499  }
500  }
501  else if (number == 31)
502  {
503  new->extlen = list[4] * 5;
504  new->ext = malloc(sizeof(g2int) * new->extlen);
505  for (i = 0; i < list[4]; i++)
506  {
507  l = i*5;
508  new->ext[l] = 2;
509  new->ext[l + 1] = 2;
510  new->ext[l + 2] = 2;
511  new->ext[l + 3] = 1;
512  new->ext[l + 4] = 4;
513  }
514  }
515  else if (number == 42)
516  {
517  if (list[22] > 1)
518  {
519  new->extlen = (list[22] - 1) * 6;
520  new->ext = malloc(sizeof(g2int) * new->extlen);
521  for (j = 2; j <= list[22]; j++)
522  {
523  l = (j - 2) * 6;
524  for (k = 0; k < 6; k++)
525  {
526  new->ext[l + k] = new->map[24 + k];
527  }
528  }
529  }
530  }
531  else if (number == 43)
532  {
533  if (list[25] > 1)
534  {
535  new->extlen = (list[25] - 1) * 6;
536  new->ext = malloc(sizeof(g2int) * new->extlen);
537  for (j = 2; j <= list[25]; j++)
538  {
539  l = (j - 2) * 6;
540  for (k = 0; k < 6; k++)
541  {
542  new->ext[l + k] = new->map[27 + k];
543  }
544  }
545  }
546  }
547  else if (number == 32)
548  {
549  new->extlen = list[9] * 10;
550  new->ext = malloc(sizeof(g2int) * new->extlen);
551  for (i = 0; i < list[9]; i++)
552  {
553  l = i * 5;
554  new->ext[l] = 2;
555  new->ext[l + 1] = 2;
556  new->ext[l + 2] = 2;
557  new->ext[l + 3] = -1;
558  new->ext[l + 4] = -4;
559  }
560  }
561  else if (number == 46)
562  {
563  if (list[27] > 1)
564  {
565  new->extlen = (list[27] - 1) * 6;
566  new->ext = malloc(sizeof(g2int) * new->extlen);
567  for (j = 2; j <= list[27]; j++)
568  {
569  l = (j - 2) * 6;
570  for (k = 0; k < 6; k++)
571  {
572  new->ext[l + k] = new->map[29 + k];
573  }
574  }
575  }
576  }
577  else if (number == 47)
578  {
579  if (list[30] > 1)
580  {
581  new->extlen = (list[30] - 1) * 6;
582  new->ext = malloc(sizeof(g2int) * new->extlen);
583  for (j = 2; j <= list[30]; j++)
584  {
585  l = (j - 2) * 6;
586  for (k = 0; k < 6; k++)
587  {
588  new->ext[l + k] = new->map[32 + k];
589  }
590  }
591  }
592  }
593  else if (number == 51)
594  {
595  new->extlen = list[15]*11;
596  new->ext = malloc(sizeof(g2int) * new->extlen);
597  for (i = 0; i < list[15]; i++)
598  {
599  l = i * 6;
600  new->ext[l] = 1;
601  new->ext[l+1] = 1;
602  new->ext[l+2] = -1;
603  new->ext[l+3] = -4;
604  new->ext[l+4] = -1;
605  new->ext[l+5] = -4;
606  }
607  }
608  else if (number == 33)
609  {
610  new->extlen = list[9];
611  new->ext = malloc(sizeof(g2int) * new->extlen);
612  for (i = 0; i < new->extlen; i++)
613  {
614  new->ext[i] = 1;
615  }
616  }
617  else if (number == 34)
618  {
619  new->extlen = ((list[24] - 1) * 6)+list[9];
620  new->ext = malloc(sizeof(g2int) * new->extlen);
621  if (list[24] > 1)
622  {
623  for (j = 2; j <= list[24]; j++)
624  {
625  l = (j - 2) * 6;
626  for (k = 0; k < 6; k++)
627  {
628  new->ext[l + k] = new->map[26 + k];
629  }
630  }
631  }
632  l = (list[24] - 1) * 6;
633  if (l < 0)
634  l = 0;
635  for (i = 0; i < list[9]; i++)
636  {
637  new->ext[l + i] = 1;
638  }
639  }
640  else if (number == 53)
641  {
642  new->extlen = list[3];
643  new->ext = malloc(sizeof(g2int) * new->extlen);
644  for (i = 0; i < new->extlen; i++)
645  {
646  new->ext[i] = 1;
647  }
648  }
649  else if (number == 54)
650  {
651  new->extlen = list[3];
652  new->ext = malloc(sizeof(g2int) * new->extlen);
653  for (i = 0;i<new->extlen;i++)
654  {
655  new->ext[i] = 1;
656  }
657  }
658  else if (number == 91)
659  {
660  new->extlen = ((list[28] - 1) * 6)+list[15];
661  new->ext = malloc(sizeof(g2int) * new->extlen);
662  if (list[28] > 1)
663  {
664  for (j = 2; j <= list[28]; j++)
665  {
666  l = (j - 2) * 6;
667  for (k = 0; k < 6; k++)
668  {
669  new->ext[l + k] = new->map[30 + k];
670  }
671  }
672  }
673  l = (list[29] - 1) * 6;
674  if (l < 0)
675  l = 0;
676  for (i = 0; i < list[15]; i++)
677  {
678  new->ext[l + i] = 1;
679  }
680  }
681  /* PDT 4.57 (10/07/2015) */
682  else if (number == 57)
683  {
684  new->extlen = list[6] * 15;
685  new->ext = malloc(sizeof(g2int) * new->extlen);
686  for (i = 0; i < list[6]; i++)
687  {
688  l = i*15;
689  new->ext[l] = 1;
690  new->ext[l+1] = -4;
691  new->ext[l+2] = 1;
692  new->ext[l+3] = 1;
693  new->ext[l+4] = 1;
694  new->ext[l+5] = 2;
695  new->ext[l+6] = 1;
696  new->ext[l+7] = 1;
697  new->ext[l+8] = -4;
698  new->ext[l+9] = 1;
699  new->ext[l+10] = -1;
700  new->ext[l+11] = -4;
701  new->ext[l+12] = 1;
702  new->ext[l+13] = -1;
703  new->ext[l+14] = -4;
704  }
705  }
706  /* PDT 4.61 (10/07/2015) */
707  else if (number == 61)
708  {
709  if (list[30] > 1)
710  {
711  new->extlen = (list[30] - 1) * 6;
712  new->ext = malloc(sizeof(g2int) * new->extlen);
713  for (j = 2; j <= list[30]; j++)
714  {
715  l = (j - 2) * 6;
716  for (k = 0; k < 6; k++)
717  {
718  new->ext[l + k] = new->map[32 + k];
719  }
720  }
721  }
722  }
723 
724  return new;
725 }
getpdstemplate
gtemplate * getpdstemplate(g2int number)
This subroutine returns PDS template information for a specified Product Definition Template.
Definition: pdstemplates.c:281
templatespds
static const struct pdstemplate templatespds[MAXPDSTEMP]
Data for struct for PDS template.
Definition: pdstemplates.c:61
MAXPDSMAPLEN
#define MAXPDSMAPLEN
Maximum template map length.
Definition: pdstemplates.c:45
getpdsindex
static g2int getpdsindex(g2int number)
This function returns the index of specified Product Definition Template in array templates.
Definition: pdstemplates.c:246
grib2_int.h
Header file with internal function prototypes NCEPLIBS-g2c library.
extpdstemplate
gtemplate * extpdstemplate(g2int number, g2int *list)
This subroutine generates the remaining octet map for a given Product Definition Template,...
Definition: pdstemplates.c:329
g2int
int64_t g2int
Long integer type.
Definition: grib2.h:28
gtemplate
Struct for GRIB template.
Definition: grib2_int.h:28
MAXPDSTEMP
#define MAXPDSTEMP
Maximum number of templates.
Definition: pdstemplates.c:44