1 | #include <stdio.h> |
---|
2 | #include <stdlib.h> |
---|
3 | #include "dprints.h" /* for debug printing */ |
---|
4 | #include "grib_lookup.h" /* PARM_DEFN */ |
---|
5 | #include "gribfuncs.h" /* prototypes */ |
---|
6 | |
---|
7 | /* DB_PARM_TBL is defined in ld_enc_inputs.c: |
---|
8 | # as of 4/9/97 this tbl is the master Parameter Table holding |
---|
9 | # MAX_PARM_TBLS sets of 256 parameters (previously known as |
---|
10 | # Tbl 0/A/B/C/D/E). |
---|
11 | # Index that are divisable by 256 are reserved and not used; |
---|
12 | # indices 000-255: Main parameter tbl (000 is reserved & not used) |
---|
13 | # indices 256-511: subtable A (256 is reserved & not used) |
---|
14 | # indices 512-767: subtable B (512 is reserved & not used) |
---|
15 | # indices 768-1023: subtable C (768 is reserved & not used) |
---|
16 | # indices 1024-1279: subtable D (1024 is reserved & not used) |
---|
17 | # indices 1080-1535: subtable E (1080 is reserved & not used) |
---|
18 | */ |
---|
19 | extern PARM_DEFN db_parm_tbl[]; |
---|
20 | |
---|
21 | /* |
---|
22 | ************************************************************************ |
---|
23 | * A. FUNCTION: map_parm |
---|
24 | * Map the given Parm_name to its appropriate usParm_id and usParm_sub |
---|
25 | * within the Parameter Lookup table, and also return its |
---|
26 | * Scale Factor and Reference which the caller can apply to the |
---|
27 | * float dta at a later time. |
---|
28 | * |
---|
29 | * INTERFACE |
---|
30 | * int map_parm (parm_name, data_input, parm_scl, parm_ref, errmsg) |
---|
31 | * |
---|
32 | * ARGUMENTS (I=input, O=output, I&O=input and output): |
---|
33 | * (I) char *parm_name |
---|
34 | * Name of Parameter to look for in the array of Parameter structs |
---|
35 | * (I&O) DATA_INPUT *data_input |
---|
36 | * attributes (usParm_id, usParm_sub_id, nDec_sc_fctr) are filled; |
---|
37 | * (O) float *parm_scl |
---|
38 | * used along with parm_ref to convert data to GRIB unit |
---|
39 | * (O) float *parm_ref |
---|
40 | * used along with parm_scl to convert data to GRIB unit |
---|
41 | * |
---|
42 | * RETURN CODE: |
---|
43 | * 0> success, DATA_INPUT, parm_scl and parm_ref filled |
---|
44 | * 1> parameter not found, errmsg filled; |
---|
45 | ************************************************************************ |
---|
46 | */ |
---|
47 | #if PROTOTYPE_NEEDED |
---|
48 | int map_parm ( char *parm_name, |
---|
49 | DATA_INPUT *data_input, |
---|
50 | float *parm_scl, |
---|
51 | float *parm_ref, |
---|
52 | char *errmsg) |
---|
53 | |
---|
54 | #else |
---|
55 | int map_parm ( parm_name, data_input, parm_scl, parm_ref, errmsg) |
---|
56 | char *parm_name; |
---|
57 | DATA_INPUT *data_input; |
---|
58 | float *parm_scl; |
---|
59 | float *parm_ref; |
---|
60 | char *errmsg; |
---|
61 | #endif |
---|
62 | { |
---|
63 | char *func= "map_parm"; |
---|
64 | int indx= 0; /* index for array */ |
---|
65 | int found = 0; /* set if located parm */ |
---|
66 | PARM_DEFN *P; /* working var */ |
---|
67 | |
---|
68 | DPRINT1 ("Entering %s\n", func); |
---|
69 | |
---|
70 | /* |
---|
71 | * A.1 SEARCH the Parameter info table for the given Parm Name |
---|
72 | */ |
---|
73 | for (P=db_parm_tbl; indx < NPARM*MAX_PARM_TBLS; P=(++indx +db_parm_tbl)) |
---|
74 | if (P->db_name[0] && !strcmp (P->db_name, parm_name)) { |
---|
75 | found=1; break; |
---|
76 | } |
---|
77 | /* |
---|
78 | * |
---|
79 | * A.2 IF (cannot find it) THEN |
---|
80 | * FILL errmsg with message |
---|
81 | * RETURN 1 ! bad status |
---|
82 | * ENDIF |
---|
83 | */ |
---|
84 | if (!found) { |
---|
85 | DPRINT1 ("No '%s' in db_parm_tbl;\n", parm_name); |
---|
86 | sprintf (errmsg, "%s: no '%s' in db_parm_tbl", func, parm_name); |
---|
87 | DPRINT1 ("Exiting %s, with errors\n", func); |
---|
88 | return (1); |
---|
89 | } |
---|
90 | /* |
---|
91 | * |
---|
92 | * A.3 FILL in Parmid, subParmid, nDec_sc_fctr of DATA_INPUT struct |
---|
93 | * FILL in Parm_scl and Parm_ref for caller |
---|
94 | */ |
---|
95 | data_input->usParm_id = P->usParm_id; |
---|
96 | data_input->usParm_sub_id = P->usParm_sub; |
---|
97 | data_input->nDec_sc_fctr = P->sDSF; |
---|
98 | *parm_scl = P->fScale; |
---|
99 | *parm_ref = P->fOffset; |
---|
100 | |
---|
101 | DPRINT4 ( |
---|
102 | "Found '%s'\nfill Data_Input->Parm_id=%d; \nfill Data_Input->Parm_sub=%d;"\ |
---|
103 | "\nfill Data_Input->DSF=%d\n", |
---|
104 | parm_name, data_input->usParm_id, data_input->usParm_sub_id, |
---|
105 | data_input->nDec_sc_fctr); |
---|
106 | |
---|
107 | /* |
---|
108 | #* |
---|
109 | * A.4 /# comment #/ |
---|
110 | #* A.4 IF (there is a scl fctr OR nonzero Offset) THEN |
---|
111 | #* APPLY Scale Fctr and Offset to Float data |
---|
112 | #* for all data points in grid |
---|
113 | #* ENDIF |
---|
114 | ##/ |
---|
115 | # ... where... data_pts was passed in as an argument... |
---|
116 | # |
---|
117 | # if (P->fScale != 1.0 || P->fOffset != 0.0) { |
---|
118 | # DPRINT3 ("Scaling FloatArr[%d pts] w/ Scale=%lf, Off=%lf\n", |
---|
119 | # data_pts, P->fScale , P->fOffset); |
---|
120 | # |
---|
121 | # for (indx=0; indx < data_pts; ++indx) |
---|
122 | # fbuff[indx]= fbuff[indx] * P->fScale + P->fOffset; |
---|
123 | # } |
---|
124 | # else { DPRINT2("Not scaling float dta (Scl=%lf, Offs=%lf)\n", |
---|
125 | # P->fScale , P->fOffset); |
---|
126 | # } |
---|
127 | */ |
---|
128 | |
---|
129 | /* |
---|
130 | * |
---|
131 | * A.5 RETURN with no errors |
---|
132 | */ |
---|
133 | DPRINT1 ("Exiting %s with no errors\n", func); |
---|
134 | return (0); |
---|
135 | /* |
---|
136 | * |
---|
137 | * END OF FUNCTION |
---|
138 | */ |
---|
139 | } |
---|