NCEPLIBS-g2c  1.6.4
pdstemplates.c
Go to the documentation of this file.
1 
21 #include <stdlib.h>
22 #include "grib2.h"
23 #include "pdstemplates.h"
24 
37 g2int
39 {
40  g2int j, getpdsindex = -1;
41 
42  for (j = 0; j < MAXPDSTEMP; j++)
43  {
44  if (number == templatespds[j].template_num)
45  {
46  getpdsindex = j;
47  return(getpdsindex);
48  }
49  }
50 
51  return(getpdsindex);
52 }
53 
72 gtemplate *
74 {
75  g2int index;
76  gtemplate *new;
77 
78  index = getpdsindex(number);
79 
80  if (index != -1)
81  {
82  new = malloc(sizeof(gtemplate));
83  new->type = 4;
84  new->num = templatespds[index].template_num;
85  new->maplen = templatespds[index].mappdslen;
86  new->needext = templatespds[index].needext;
87  new->map = (g2int *)templatespds[index].mappds;
88  new->extlen = 0;
89  new->ext = NULL;
90  return(new);
91  }
92  else {
93  printf("getpdstemplate: PDS Template 4.%d not defined.\n", (int)number);
94  return(NULL);
95  }
96 
97  return(NULL);
98 }
99 
120 gtemplate *
121 extpdstemplate(g2int number, g2int *list)
122 {
123  gtemplate *new;
124  g2int index, i, j, k, l;
125 
126  index = getpdsindex(number);
127  if (index == -1)
128  return(0);
129 
130  new = getpdstemplate(number);
131 
132  if (!new->needext)
133  return(new);
134 
135  if (number == 3)
136  {
137  new->extlen = list[26];
138  new->ext = malloc(sizeof(g2int) * new->extlen);
139  for (i = 0; i < new->extlen; i++)
140  {
141  new->ext[i] = 1;
142  }
143  }
144  else if (number == 4)
145  {
146  new->extlen = list[25];
147  new->ext = malloc(sizeof(g2int) * new->extlen);
148  for (i = 0; i < new->extlen; i++)
149  {
150  new->ext[i] = 1;
151  }
152  }
153  else if (number == 8)
154  {
155  if (list[21] > 1)
156  {
157  new->extlen = (list[21] - 1) * 6;
158  new->ext = malloc(sizeof(g2int) * new->extlen);
159  for (j = 2; j <= list[21]; j++)
160  {
161  l = (j - 2) * 6;
162  for (k = 0; k < 6; k++)
163  {
164  new->ext[l+k] = new->map[23 + k];
165  }
166  }
167  }
168  }
169  else if (number == 9)
170  {
171  if (list[28] > 1)
172  {
173  new->extlen = (list[28] - 1) * 6;
174  new->ext = malloc(sizeof(g2int) * new->extlen);
175  for (j = 2; j <= list[28]; j++)
176  {
177  l = (j - 2) * 6;
178  for (k = 0; k < 6; k++)
179  {
180  new->ext[l + k] = new->map[30 + k];
181  }
182  }
183  }
184  }
185  else if (number == 10)
186  {
187  if (list[22] > 1)
188  {
189  new->extlen = (list[22] - 1) * 6;
190  new->ext = (g2int *)malloc(sizeof(g2int)*new->extlen);
191  for (j = 2; j <= list[22]; j++)
192  {
193  l = (j - 2) * 6;
194  for (k = 0; k < 6; k++)
195  {
196  new->ext[l + k] = new->map[24 + k];
197  }
198  }
199  }
200  }
201  else if (number == 11)
202  {
203  if (list[24] > 1)
204  {
205  new->extlen = (list[24] - 1) * 6;
206  new->ext = malloc(sizeof(g2int) * new->extlen);
207  for (j = 2; j <= list[24]; j++)
208  {
209  l = (j - 2) * 6;
210  for (k = 0; k < 6; k++)
211  {
212  new->ext[l + k] = new->map[26 + k];
213  }
214  }
215  }
216  }
217  else if (number == 12)
218  {
219  if (list[23] > 1)
220  {
221  new->extlen = (list[23] - 1) * 6;
222  new->ext = malloc(sizeof(g2int) * new->extlen);
223  for (j = 2; j <= list[23]; j++)
224  {
225  l = (j - 2) * 6;
226  for (k = 0; k < 6; k++)
227  {
228  new->ext[l + k] = new->map[25 + k];
229  }
230  }
231  }
232  }
233  else if (number == 13)
234  {
235  new->extlen = ((list[37] - 1) * 6) + list[26];
236  new->ext = malloc(sizeof(g2int) * new->extlen);
237  if (list[37] > 1)
238  {
239  for (j = 2; j <= list[37]; j++)
240  {
241  l = (j - 2) * 6;
242  for (k = 0; k < 6; k++)
243  {
244  new->ext[l + k] = new->map[39 + k];
245  }
246  }
247  }
248  l = (list[37] - 1) * 6;
249  if (l < 0)
250  l = 0;
251  for (i = 0; i < list[26]; i++)
252  {
253  new->ext[l+i] = 1;
254  }
255  }
256  else if (number == 14)
257  {
258  new->extlen = ((list[36] - 1) * 6) + list[25];
259  new->ext = malloc(sizeof(g2int) * new->extlen);
260  if (list[36] > 1)
261  {
262  for (j = 2; j <= list[36]; j++)
263  {
264  l = (j - 2) * 6;
265  for (k = 0; k < 6; k++)
266  {
267  new->ext[l + k] = new->map[38 + k];
268  }
269  }
270  }
271  l = (list[36] - 1) * 6;
272  if (l < 0)
273  l = 0;
274  for (i = 0; i < list[25]; i++)
275  {
276  new->ext[l + i] = 1;
277  }
278  }
279  else if (number == 30)
280  {
281  new->extlen = list[4] * 5;
282  new->ext = malloc(sizeof(g2int) * new->extlen);
283  for (i = 0;i < list[4]; i++)
284  {
285  l = i * 5;
286  new->ext[l] = 2;
287  new->ext[l + 1] = 2;
288  new->ext[l + 2] = 1;
289  new->ext[l + 3] = 1;
290  new->ext[l + 4] = 4;
291  }
292  }
293  else if (number == 31)
294  {
295  new->extlen = list[4] * 5;
296  new->ext = malloc(sizeof(g2int) * new->extlen);
297  for (i = 0; i < list[4]; i++)
298  {
299  l = i*5;
300  new->ext[l] = 2;
301  new->ext[l + 1] = 2;
302  new->ext[l + 2] = 2;
303  new->ext[l + 3] = 1;
304  new->ext[l + 4] = 4;
305  }
306  }
307  else if (number == 42)
308  {
309  if (list[22] > 1)
310  {
311  new->extlen = (list[22] - 1) * 6;
312  new->ext = malloc(sizeof(g2int) * new->extlen);
313  for (j = 2; j <= list[22]; j++)
314  {
315  l = (j - 2) * 6;
316  for (k = 0; k < 6; k++)
317  {
318  new->ext[l + k] = new->map[24 + k];
319  }
320  }
321  }
322  }
323  else if (number == 43)
324  {
325  if (list[25] > 1)
326  {
327  new->extlen = (list[25] - 1) * 6;
328  new->ext = malloc(sizeof(g2int) * new->extlen);
329  for (j = 2; j <= list[25]; j++)
330  {
331  l = (j - 2) * 6;
332  for (k = 0; k < 6; k++)
333  {
334  new->ext[l + k] = new->map[27 + k];
335  }
336  }
337  }
338  }
339  else if (number == 32)
340  {
341  new->extlen = list[9] * 10;
342  new->ext = malloc(sizeof(g2int) * new->extlen);
343  for (i = 0; i < list[9]; i++)
344  {
345  l = i * 5;
346  new->ext[l] = 2;
347  new->ext[l + 1] = 2;
348  new->ext[l + 2] = 2;
349  new->ext[l + 3] = -1;
350  new->ext[l + 4] = -4;
351  }
352  }
353  else if (number == 46)
354  {
355  if (list[27] > 1)
356  {
357  new->extlen = (list[27] - 1) * 6;
358  new->ext = malloc(sizeof(g2int) * new->extlen);
359  for (j = 2; j <= list[27]; j++)
360  {
361  l = (j - 2) * 6;
362  for (k = 0; k < 6; k++)
363  {
364  new->ext[l + k] = new->map[29 + k];
365  }
366  }
367  }
368  }
369  else if (number == 47)
370  {
371  if (list[30] > 1)
372  {
373  new->extlen = (list[30] - 1) * 6;
374  new->ext = malloc(sizeof(g2int) * new->extlen);
375  for (j = 2; j <= list[30]; j++)
376  {
377  l = (j - 2) * 6;
378  for (k = 0; k < 6; k++)
379  {
380  new->ext[l + k] = new->map[32 + k];
381  }
382  }
383  }
384  else if (number == 51)
385  {
386  new->extlen = list[15]*11;
387  new->ext = malloc(sizeof(g2int) * new->extlen);
388  for (i = 0; i < list[15]; i++)
389  {
390  l = i * 6;
391  new->ext[l] = 1;
392  new->ext[l+1] = 1;
393  new->ext[l+2] = -1;
394  new->ext[l+3] = -4;
395  new->ext[l+4] = -1;
396  new->ext[l+5] = -4;
397  }
398  }
399  else if (number == 33)
400  {
401  new->extlen = list[9];
402  new->ext = malloc(sizeof(g2int) * new->extlen);
403  for (i = 0; i < new->extlen; i++)
404  {
405  new->ext[i] = 1;
406  }
407  }
408  else if (number == 34)
409  {
410  new->extlen = ((list[24] - 1) * 6)+list[9];
411  new->ext = malloc(sizeof(g2int) * new->extlen);
412  if (list[24] > 1)
413  {
414  for (j = 2; j <= list[24]; j++)
415  {
416  l = (j - 2) * 6;
417  for (k = 0; k < 6; k++)
418  {
419  new->ext[l + k] = new->map[26 + k];
420  }
421  }
422  }
423  l = (list[24] - 1) * 6;
424  if (l < 0)
425  l = 0;
426  for (i = 0; i < list[9]; i++)
427  {
428  new->ext[l + i] = 1;
429  }
430  }
431  else if (number == 53)
432  {
433  new->extlen = list[3];
434  new->ext = malloc(sizeof(g2int) * new->extlen);
435  for (i = 0; i < new->extlen; i++)
436  {
437  new->ext[i] = 1;
438  }
439  }
440  else if (number == 54)
441  {
442  new->extlen = list[3];
443  new->ext = malloc(sizeof(g2int) * new->extlen);
444  for (i = 0;i<new->extlen;i++)
445  {
446  new->ext[i] = 1;
447  }
448  }
449  else if (number == 91)
450  {
451  new->extlen = ((list[28] - 1) * 6)+list[15];
452  new->ext = malloc(sizeof(g2int) * new->extlen);
453  if (list[28] > 1)
454  {
455  for (j = 2; j <= list[28]; j++)
456  {
457  l = (j - 2) * 6;
458  for (k = 0; k < 6; k++)
459  {
460  new->ext[l + k] = new->map[30 + k];
461  }
462  }
463  }
464  l = (list[29] - 1) * 6;
465  if (l < 0)
466  l = 0;
467  for (i = 0; i < list[15]; i++)
468  {
469  new->ext[l + i] = 1;
470  }
471  }
472  /* PDT 4.57 (10/07/2015) */
473  else if (number == 57)
474  {
475  new->extlen = list[6] * 15;
476  new->ext = malloc(sizeof(g2int) * new->extlen);
477  for (i = 0; i < list[6]; i++)
478  {
479  l = i*15;
480  new->ext[l] = 1;
481  new->ext[l+1] = -4;
482  new->ext[l+2] = 1;
483  new->ext[l+3] = 1;
484  new->ext[l+4] = 1;
485  new->ext[l+5] = 2;
486  new->ext[l+6] = 1;
487  new->ext[l+7] = 1;
488  new->ext[l+8] = -4;
489  new->ext[l+9] = 1;
490  new->ext[l+10] = -1;
491  new->ext[l+11] = -4;
492  new->ext[l+12] = 1;
493  new->ext[l+13] = -1;
494  new->ext[l+14] = -4;
495  }
496  }
497  /* PDT 4.61 (10/07/2015) */
498  else if (number == 61)
499  {
500  if (list[30] > 1)
501  {
502  new->extlen = (list[30] - 1) * 6;
503  new->ext = malloc(sizeof(g2int) * new->extlen);
504  for (j = 2; j <= list[30]; j++)
505  {
506  l = (j - 2) * 6;
507  for (k = 0; k < 6; k++)
508  {
509  new->ext[l + k] = new->map[32 + k];
510  }
511  }
512  }
513  }
514  }
515 
516  return(new);
517 }
Header file for NCEPLIBS-g2c library.
int64_t g2int
Long integer type.
Definition: grib2.h:20
Struct for GRIB template.
Definition: grib2.h:28
gtemplate * extpdstemplate(g2int number, g2int *list)
This subroutine generates the remaining octet map for a given Product Definition Template,...
Definition: pdstemplates.c:121
g2int getpdsindex(g2int number)
This function returns the index of specified Product Definition Template in array templates.
Definition: pdstemplates.c:38
gtemplate * getpdstemplate(g2int number)
This subroutine returns PDS template information for a specified Product Definition Template.
Definition: pdstemplates.c:73
This include file contains info on all the available GRIB2 Product Definition Templates used in [Sect...
#define MAXPDSTEMP
Maximum number of templates.
Definition: pdstemplates.h:47
g2int needext
Does template need extension?
Definition: pdstemplates.h:57
const struct pdstemplate templatespds[MAXPDSTEMP]
Date for struct for PDS template.
Definition: pdstemplates.h:64
g2int template_num
Template number.
Definition: pdstemplates.h:55
g2int mappdslen
The number of entries in the template.
Definition: pdstemplates.h:56