/src/gdal/frmts/grib/degrib/g2clib/pack_gp.c
Line | Count | Source |
1 | | /* pack_gp.f -- translated by f2c (version 20031025). |
2 | | You must link the resulting object file with libf2c: |
3 | | on Microsoft Windows system, link with libf2c.lib; |
4 | | on Linux or Unix systems, link with .../path/to/libf2c.a -lm |
5 | | or, if you install libf2c.a in a standard place, with -lf2c -lm |
6 | | -- in that order, at the end of the command line, as in |
7 | | cc *.o -lf2c -lm |
8 | | Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., |
9 | | |
10 | | http://www.netlib.org/f2c/libf2c.zip |
11 | | */ |
12 | | |
13 | | /*#include "f2c.h"*/ |
14 | | #include "cpl_port.h" |
15 | | #include <limits.h> |
16 | | #include <stdlib.h> |
17 | | #include "grib2.h" |
18 | | typedef g2int logical; |
19 | 343k | #define TRUE_ (1) |
20 | 55.7k | #define FALSE_ (0) |
21 | | |
22 | | /* Subroutine */ int pack_gp(integer *kfildo, integer *ic, integer *nxy, |
23 | | integer *is523, integer *minpk, integer *inc, integer *missp, integer |
24 | | *misss, integer *jmin, integer *jmax, integer *lbit, integer *nov, |
25 | | integer *ndg, integer *lx, integer *ibit, integer *jbit, integer * |
26 | | kbit, integer *novref, integer *lbitref, integer *ier) |
27 | 946 | { |
28 | | /* Initialized data */ |
29 | | |
30 | 946 | const integer mallow = 1073741825; /* MALLOW=2**30+1 */ |
31 | 946 | integer ifeed = 12; |
32 | 946 | integer ifirst = 0; |
33 | | |
34 | | /* System generated locals */ |
35 | 946 | integer i__1, i__2, i__3; |
36 | | |
37 | | /* Local variables */ |
38 | 946 | integer j, k, l; |
39 | 946 | logical adda; |
40 | 946 | integer ired, kinc, mina, maxa, minb = 0, maxb = 0, minc = 0, maxc = 0, ibxx2[31]; |
41 | 946 | char cfeed[1]; |
42 | 946 | integer nenda, nendb = 0, ibita, ibitb = 0, minak, minbk = 0, maxak, maxbk = 0, |
43 | 946 | minck = 0, maxck, nouta = 0, lmiss, itest = 0, nount = 0; |
44 | 946 | extern /* Subroutine */ int reduce(integer *, integer *, integer *, |
45 | 946 | integer *, integer *, integer *, integer *, integer *, integer *, |
46 | 946 | integer *, integer *, integer *, integer *); |
47 | 946 | integer ibitbs = 0, mislla, misllb = 0, misllc = 0, iersav = 0, lminpk, ktotal, |
48 | 946 | kounta, kountb = 0, kstart, mstart = 0, mintst = 0, maxtst = 0, |
49 | 946 | kounts = 0, mintstk = 0, maxtstk = 0; |
50 | 946 | integer *misslx; |
51 | | |
52 | | |
53 | | /* FEBRUARY 1994 GLAHN TDL MOS-2000 */ |
54 | | /* JUNE 1995 GLAHN MODIFIED FOR LMISS ERROR. */ |
55 | | /* JULY 1996 GLAHN ADDED MISSS */ |
56 | | /* FEBRUARY 1997 GLAHN REMOVED 4 REDUNDANT TESTS FOR */ |
57 | | /* MISSP.EQ.0; INSERTED A TEST TO BETTER */ |
58 | | /* HANDLE A STRING OF 9999'S */ |
59 | | /* FEBRUARY 1997 GLAHN ADDED LOOPS TO ELIMINATE TEST FOR */ |
60 | | /* MISSS WHEN MISSS = 0 */ |
61 | | /* MARCH 1997 GLAHN CORRECTED FOR SECONDARY MISSING VALUE */ |
62 | | /* MARCH 1997 GLAHN CORRECTED FOR USE OF LOCAL VALUE */ |
63 | | /* OF MINPK */ |
64 | | /* MARCH 1997 GLAHN CORRECTED FOR SECONDARY MISSING VALUE */ |
65 | | /* MARCH 1997 GLAHN CHANGED CALCULATING NUMBER OF BITS */ |
66 | | /* THROUGH EXPONENTS TO AN ARRAY (IMPROVED */ |
67 | | /* OVERALL PACKING PERFORMANCE BY ABOUT */ |
68 | | /* 35 PERCENT!). ALLOWED 0 BITS FOR */ |
69 | | /* PACKING JMIN( ), LBIT( ), AND NOV( ). */ |
70 | | /* MAY 1997 GLAHN A NUMBER OF CHANGES FOR EFFICIENCY. */ |
71 | | /* MOD FUNCTIONS ELIMINATED AND ONE */ |
72 | | /* IFTHEN ADDED. JOUNT REMOVED. */ |
73 | | /* RECOMPUTATION OF BITS NOT MADE UNLESS */ |
74 | | /* NECESSARY AFTER MOVING POINTS FROM */ |
75 | | /* ONE GROUP TO ANOTHER. NENDB ADJUSTED */ |
76 | | /* TO ELIMINATE POSSIBILITY OF VERY */ |
77 | | /* SMALL GROUP AT THE END. */ |
78 | | /* ABOUT 8 PERCENT IMPROVEMENT IN */ |
79 | | /* OVERALL PACKING. ISKIPA REMOVED; */ |
80 | | /* THERE IS ALWAYS A GROUP B THAT CAN */ |
81 | | /* BECOME GROUP A. CONTROL ON SIZE */ |
82 | | /* OF GROUP B (STATEMENT BELOW 150) */ |
83 | | /* ADDED. ADDED ADDA, AND USE */ |
84 | | /* OF GE AND LE INSTEAD OF GT AND LT */ |
85 | | /* IN LOOPS BETWEEN 150 AND 160. */ |
86 | | /* IBITBS ADDED TO SHORTEN TRIPS */ |
87 | | /* THROUGH LOOP. */ |
88 | | /* MARCH 2000 GLAHN MODIFIED FOR GRIB2; CHANGED NAME FROM */ |
89 | | /* PACKGP */ |
90 | | /* JANUARY 2001 GLAHN COMMENTS; IER = 706 SUBSTITUTED FOR */ |
91 | | /* STOPS; ADDED RETURN1; REMOVED STATEMENT */ |
92 | | /* NUMBER 110; ADDED IER AND * RETURN */ |
93 | | /* NOVEMBER 2001 GLAHN CHANGED SOME DIAGNOSTIC FORMATS TO */ |
94 | | /* ALLOW PRINTING LARGER NUMBERS */ |
95 | | /* NOVEMBER 2001 GLAHN ADDED MISSLX( ) TO PUT MAXIMUM VALUE */ |
96 | | /* INTO JMIN( ) WHEN ALL VALUES MISSING */ |
97 | | /* TO AGREE WITH GRIB STANDARD. */ |
98 | | /* NOVEMBER 2001 GLAHN CHANGED TWO TESTS ON MISSP AND MISSS */ |
99 | | /* EQ 0 TO TESTS ON IS523. HOWEVER, */ |
100 | | /* MISSP AND MISSS CANNOT IN GENERAL BE */ |
101 | | /* = 0. */ |
102 | | /* NOVEMBER 2001 GLAHN ADDED CALL TO REDUCE; DEFINED ITEST */ |
103 | | /* BEFORE LOOPS TO REDUCE COMPUTATION; */ |
104 | | /* STARTED LARGE GROUP WHEN ALL SAME */ |
105 | | /* VALUE */ |
106 | | /* DECEMBER 2001 GLAHN MODIFIED AND ADDED A FEW COMMENTS */ |
107 | | /* JANUARY 2002 GLAHN REMOVED LOOP BEFORE 150 TO DETERMINE */ |
108 | | /* A GROUP OF ALL SAME VALUE */ |
109 | | /* JANUARY 2002 GLAHN CHANGED MALLOW FROM 9999999 TO 2**30+1, */ |
110 | | /* AND MADE IT A PARAMETER */ |
111 | | /* MARCH 2002 GLAHN ADDED NON FATAL IER = 716, 717; */ |
112 | | /* REMOVED NENDB=NXY ABOVE 150; */ |
113 | | /* ADDED IERSAV=0; COMMENTS */ |
114 | | |
115 | | /* PURPOSE */ |
116 | | /* DETERMINES GROUPS OF VARIABLE SIZE, BUT AT LEAST OF */ |
117 | | /* SIZE MINPK, THE ASSOCIATED MAX (JMAX( )) AND MIN (JMIN( )), */ |
118 | | /* THE NUMBER OF BITS NECESSARY TO HOLD THE VALUES IN EACH */ |
119 | | /* GROUP (LBIT( )), THE NUMBER OF VALUES IN EACH GROUP */ |
120 | | /* (NOV( )), THE NUMBER OF BITS NECESSARY TO PACK THE JMIN( ) */ |
121 | | /* VALUES (IBIT), THE NUMBER OF BITS NECESSARY TO PACK THE */ |
122 | | /* LBIT( ) VALUES (JBIT), AND THE NUMBER OF BITS NECESSARY */ |
123 | | /* TO PACK THE NOV( ) VALUES (KBIT). THE ROUTINE IS DESIGNED */ |
124 | | /* TO DETERMINE THE GROUPS SUCH THAT A SMALL NUMBER OF BITS */ |
125 | | /* IS NECESSARY TO PACK THE DATA WITHOUT EXCESSIVE */ |
126 | | /* COMPUTATIONS. IF ALL VALUES IN THE GROUP ARE ZERO, THE */ |
127 | | /* NUMBER OF BITS TO USE IN PACKING IS DEFINED AS ZERO WHEN */ |
128 | | /* THERE CAN BE NO MISSING VALUES; WHEN THERE CAN BE MISSING */ |
129 | | /* VALUES, THE NUMBER OF BITS MUST BE AT LEAST 1 TO HAVE */ |
130 | | /* THE CAPABILITY TO RECOGNIZE THE MISSING VALUE. HOWEVER, */ |
131 | | /* IF ALL VALUES IN A GROUP ARE MISSING, THE NUMBER OF BITS */ |
132 | | /* NEEDED IS 0, AND THE UNPACKER RECOGNIZES THIS. */ |
133 | | /* ALL VARIABLES ARE INTEGER. EVEN THOUGH THE GROUPS ARE */ |
134 | | /* INITIALLY OF SIZE MINPK OR LARGER, AN ADJUSTMENT BETWEEN */ |
135 | | /* TWO GROUPS (THE LOOKBACK PROCEDURE) MAY MAKE A GROUP */ |
136 | | /* SMALLER THAN MINPK. THE CONTROL ON GROUP SIZE IS THAT */ |
137 | | /* THE SUM OF THE SIZES OF THE TWO CONSECUTIVE GROUPS, EACH OF */ |
138 | | /* SIZE MINPK OR LARGER, IS NOT DECREASED. WHEN DETERMINING */ |
139 | | /* THE NUMBER OF BITS NECESSARY FOR PACKING, THE LARGEST */ |
140 | | /* VALUE THAT CAN BE ACCOMMODATED IN, SAY, MBITS, IS */ |
141 | | /* 2**MBITS-1; THIS LARGEST VALUE (AND THE NEXT SMALLEST */ |
142 | | /* VALUE) IS RESERVED FOR THE MISSING VALUE INDICATOR (ONLY) */ |
143 | | /* WHEN IS523 NE 0. IF THE DIMENSION NDG */ |
144 | | /* IS NOT LARGE ENOUGH TO HOLD ALL THE GROUPS, THE LOCAL VALUE */ |
145 | | /* OF MINPK IS INCREASED BY 50 PERCENT. THIS IS REPEATED */ |
146 | | /* UNTIL NDG WILL SUFFICE. A DIAGNOSTIC IS PRINTED WHENEVER */ |
147 | | /* THIS HAPPENS, WHICH SHOULD BE VERY RARELY. IF IT HAPPENS */ |
148 | | /* OFTEN, NDG IN SUBROUTINE PACK SHOULD BE INCREASED AND */ |
149 | | /* A CORRESPONDING INCREASE IN SUBROUTINE UNPACK MADE. */ |
150 | | /* CONSIDERABLE CODE IS PROVIDED SO THAT NO MORE CHECKING */ |
151 | | /* FOR MISSING VALUES WITHIN LOOPS IS DONE THAN NECESSARY; */ |
152 | | /* THE ADDED EFFICIENCY OF THIS IS RELATIVELY MINOR, */ |
153 | | /* BUT DOES NO HARM. FOR GRIB2, THE REFERENCE VALUE FOR */ |
154 | | /* THE LENGTH OF GROUPS IN NOV( ) AND FOR THE NUMBER OF */ |
155 | | /* BITS NECESSARY TO PACK GROUP VALUES ARE DETERMINED, */ |
156 | | /* AND SUBTRACTED BEFORE JBIT AND KBIT ARE DETERMINED. */ |
157 | | |
158 | | /* WHEN 1 OR MORE GROUPS ARE LARGE COMPARED TO THE OTHERS, */ |
159 | | /* THE WIDTH OF ALL GROUPS MUST BE AS LARGE AS THE LARGEST. */ |
160 | | /* A SUBROUTINE REDUCE BREAKS UP LARGE GROUPS INTO 2 OR */ |
161 | | /* MORE TO REDUCE TOTAL BITS REQUIRED. IF REDUCE SHOULD */ |
162 | | /* ABORT, PACK_GP WILL BE EXECUTED AGAIN WITHOUT THE CALL */ |
163 | | /* TO REDUCE. */ |
164 | | |
165 | | /* DATA SET USE */ |
166 | | /* KFILDO - UNIT NUMBER FOR OUTPUT (PRINT) FILE. (OUTPUT) */ |
167 | | |
168 | | /* VARIABLES IN CALL SEQUENCE */ |
169 | | /* KFILDO = UNIT NUMBER FOR OUTPUT (PRINT) FILE. (INPUT) */ |
170 | | /* IC( ) = ARRAY TO HOLD DATA FOR PACKING. THE VALUES */ |
171 | | /* DO NOT HAVE TO BE POSITIVE AT THIS POINT, BUT */ |
172 | | /* MUST BE IN THE RANGE -2**30 TO +2**30 (THE */ |
173 | | /* THE VALUE OF MALLOW). THESE INTEGER VALUES */ |
174 | | /* WILL BE RETAINED EXACTLY THROUGH PACKING AND */ |
175 | | /* UNPACKING. (INPUT) */ |
176 | | /* NXY = NUMBER OF VALUES IN IC( ). ALSO TREATED */ |
177 | | /* AS ITS DIMENSION. (INPUT) */ |
178 | | /* IS523 = missing value management */ |
179 | | /* 0=data contains no missing values */ |
180 | | /* 1=data contains Primary missing values */ |
181 | | /* 2=data contains Primary and secondary missing values */ |
182 | | /* (INPUT) */ |
183 | | /* MINPK = THE MINIMUM SIZE OF EACH GROUP, EXCEPT POSSIBLY */ |
184 | | /* THE LAST ONE. (INPUT) */ |
185 | | /* INC = THE NUMBER OF VALUES TO ADD TO AN ALREADY */ |
186 | | /* EXISTING GROUP IN DETERMINING WHETHER OR NOT */ |
187 | | /* TO START A NEW GROUP. IDEALLY, THIS WOULD BE */ |
188 | | /* 1, BUT EACH TIME INC VALUES ARE ATTEMPTED, THE */ |
189 | | /* MAX AND MIN OF THE NEXT MINPK VALUES MUST BE */ |
190 | | /* FOUND. THIS IS "A LOOP WITHIN A LOOP," AND */ |
191 | | /* A SLIGHTLY LARGER VALUE MAY GIVE ABOUT AS GOOD */ |
192 | | /* RESULTS WITH SLIGHTLY LESS COMPUTATIONAL TIME. */ |
193 | | /* IF INC IS LE 0, 1 IS USED, AND A DIAGNOSTIC IS */ |
194 | | /* OUTPUT. NOTE: IT IS EXPECTED THAT INC WILL */ |
195 | | /* EQUAL 1. THE CODE USES INC PRIMARILY IN THE */ |
196 | | /* LOOPS STARTING AT STATEMENT 180. IF INC */ |
197 | | /* WERE 1, THERE WOULD NOT NEED TO BE LOOPS */ |
198 | | /* AS SUCH. HOWEVER, KINC (THE LOCAL VALUE OF */ |
199 | | /* INC) IS SET GE 1 WHEN NEAR THE END OF THE DATA */ |
200 | | /* TO FORESTALL A VERY SMALL GROUP AT THE END. */ |
201 | | /* (INPUT) */ |
202 | | /* MISSP = WHEN MISSING POINTS CAN BE PRESENT IN THE DATA, */ |
203 | | /* THEY WILL HAVE THE VALUE MISSP OR MISSS. */ |
204 | | /* MISSP IS THE PRIMARY MISSING VALUE AND MISSS */ |
205 | | /* IS THE SECONDARY MISSING VALUE . THESE MUST */ |
206 | | /* NOT BE VALUES THAT WOULD OCCUR WITH SUBTRACTING */ |
207 | | /* THE MINIMUM (REFERENCE) VALUE OR SCALING. */ |
208 | | /* FOR EXAMPLE, MISSP = 0 WOULD NOT BE ADVISABLE. */ |
209 | | /* (INPUT) */ |
210 | | /* MISSS = SECONDARY MISSING VALUE INDICATOR (SEE MISSP). */ |
211 | | /* (INPUT) */ |
212 | | /* JMIN(J) = THE MINIMUM OF EACH GROUP (J=1,LX). (OUTPUT) */ |
213 | | /* JMAX(J) = THE MAXIMUM OF EACH GROUP (J=1,LX). THIS IS */ |
214 | | /* NOT REALLY NEEDED, BUT SINCE THE MAX OF EACH */ |
215 | | /* GROUP MUST BE FOUND, SAVING IT HERE IS CHEAP */ |
216 | | /* IN CASE THE USER WANTS IT. (OUTPUT) */ |
217 | | /* LBIT(J) = THE NUMBER OF BITS NECESSARY TO PACK EACH GROUP */ |
218 | | /* (J=1,LX). IT IS ASSUMED THE MINIMUM OF EACH */ |
219 | | /* GROUP WILL BE REMOVED BEFORE PACKING, AND THE */ |
220 | | /* VALUES TO PACK WILL, THEREFORE, ALL BE POSITIVE. */ |
221 | | /* HOWEVER, IC( ) DOES NOT NECESSARILY CONTAIN */ |
222 | | /* ALL POSITIVE VALUES. IF THE OVERALL MINIMUM */ |
223 | | /* HAS BEEN REMOVED (THE USUAL CASE), THEN IC( ) */ |
224 | | /* WILL CONTAIN ONLY POSITIVE VALUES. (OUTPUT) */ |
225 | | /* NOV(J) = THE NUMBER OF VALUES IN EACH GROUP (J=1,LX). */ |
226 | | /* (OUTPUT) */ |
227 | | /* NDG = THE DIMENSION OF JMIN( ), JMAX( ), LBIT( ), AND */ |
228 | | /* NOV( ). (INPUT) */ |
229 | | /* LX = THE NUMBER OF GROUPS DETERMINED. (OUTPUT) */ |
230 | | /* IBIT = THE NUMBER OF BITS NECESSARY TO PACK THE JMIN(J) */ |
231 | | /* VALUES, J=1,LX. (OUTPUT) */ |
232 | | /* JBIT = THE NUMBER OF BITS NECESSARY TO PACK THE LBIT(J) */ |
233 | | /* VALUES, J=1,LX. (OUTPUT) */ |
234 | | /* KBIT = THE NUMBER OF BITS NECESSARY TO PACK THE NOV(J) */ |
235 | | /* VALUES, J=1,LX. (OUTPUT) */ |
236 | | /* NOVREF = REFERENCE VALUE FOR NOV( ). (OUTPUT) */ |
237 | | /* LBITREF = REFERENCE VALUE FOR LBIT( ). (OUTPUT) */ |
238 | | /* IER = ERROR RETURN. */ |
239 | | /* 706 = VALUE WILL NOT PACK IN 30 BITS--FATAL */ |
240 | | /* 714 = ERROR IN REDUCE--NON-FATAL */ |
241 | | /* 715 = NGP NOT LARGE ENOUGH IN REDUCE--NON-FATAL */ |
242 | | /* 716 = MINPK INCEASED--NON-FATAL */ |
243 | | /* 717 = INC SET = 1--NON-FATAL */ |
244 | | /* (OUTPUT) */ |
245 | | /* * = ALTERNATE RETURN WHEN IER NE 0 AND FATAL ERROR. */ |
246 | | |
247 | | /* INTERNAL VARIABLES */ |
248 | | /* CFEED = CONTAINS THE CHARACTER REPRESENTATION */ |
249 | | /* OF A PRINTER FORM FEED. */ |
250 | | /* IFEED = CONTAINS THE INTEGER VALUE OF A PRINTER */ |
251 | | /* FORM FEED. */ |
252 | | /* KINC = WORKING COPY OF INC. MAY BE MODIFIED. */ |
253 | | /* MINA = MINIMUM VALUE IN GROUP A. */ |
254 | | /* MAXA = MAXIMUM VALUE IN GROUP A. */ |
255 | | /* NENDA = THE PLACE IN IC( ) WHERE GROUP A ENDS. */ |
256 | | /* KSTART = THE PLACE IN IC( ) WHERE GROUP A STARTS. */ |
257 | | /* IBITA = NUMBER OF BITS NEEDED TO HOLD VALUES IN GROUP A. */ |
258 | | /* MINB = MINIMUM VALUE IN GROUP B. */ |
259 | | /* MAXB = MAXIMUM VALUE IN GROUP B. */ |
260 | | /* NENDB = THE PLACE IN IC( ) WHERE GROUP B ENDS. */ |
261 | | /* IBITB = NUMBER OF BITS NEEDED TO HOLD VALUES IN GROUP B. */ |
262 | | /* MINC = MINIMUM VALUE IN GROUP C. */ |
263 | | /* MAXC = MAXIMUM VALUE IN GROUP C. */ |
264 | | /* KTOTAL = COUNT OF NUMBER OF VALUES IN IC( ) PROCESSED. */ |
265 | | /* NOUNT = NUMBER OF VALUES ADDED TO GROUP A. */ |
266 | | /* LMISS = 0 WHEN IS523 = 0. WHEN PACKING INTO A */ |
267 | | /* SPECIFIC NUMBER OF BITS, SAY MBITS, */ |
268 | | /* THE MAXIMUM VALUE THAT CAN BE HANDLED IS */ |
269 | | /* 2**MBITS-1. WHEN IS523 = 1, INDICATING */ |
270 | | /* PRIMARY MISSING VALUES, THIS MAXIMUM VALUE */ |
271 | | /* IS RESERVED TO HOLD THE PRIMARY MISSING VALUE */ |
272 | | /* INDICATOR AND LMISS = 1. WHEN IS523 = 2, */ |
273 | | /* THE VALUE JUST BELOW THE MAXIMUM (I.E., */ |
274 | | /* 2**MBITS-2) IS RESERVED TO HOLD THE SECONDARY */ |
275 | | /* MISSING VALUE INDICATOR AND LMISS = 2. */ |
276 | | /* LMINPK = LOCAL VALUE OF MINPK. THIS WILL BE ADJUSTED */ |
277 | | /* UPWARD WHENEVER NDG IS NOT LARGE ENOUGH TO HOLD */ |
278 | | /* ALL THE GROUPS. */ |
279 | | /* MALLOW = THE LARGEST ALLOWABLE VALUE FOR PACKING. */ |
280 | | /* MISLLA = SET TO 1 WHEN ALL VALUES IN GROUP A ARE MISSING. */ |
281 | | /* THIS IS USED TO DISTINGUISH BETWEEN A REAL */ |
282 | | /* MINIMUM WHEN ALL VALUES ARE NOT MISSING */ |
283 | | /* AND A MINIMUM THAT HAS BEEN SET TO ZERO WHEN */ |
284 | | /* ALL VALUES ARE MISSING. 0 OTHERWISE. */ |
285 | | /* NOTE THAT THIS DOES NOT DISTINGUISH BETWEEN */ |
286 | | /* PRIMARY AND SECONDARY MISSING WHEN SECONDARY */ |
287 | | /* MISSING ARE PRESENT. THIS MEANS THAT */ |
288 | | /* LBIT( ) WILL NOT BE ZERO WITH THE RESULTING */ |
289 | | /* COMPRESSION EFFICIENCY WHEN SECONDARY MISSING */ |
290 | | /* ARE PRESENT. ALSO NOTE THAT A CHECK HAS BEEN */ |
291 | | /* MADE EARLIER TO DETERMINE THAT SECONDARY */ |
292 | | /* MISSING ARE REALLY THERE. */ |
293 | | /* MISLLB = SET TO 1 WHEN ALL VALUES IN GROUP B ARE MISSING. */ |
294 | | /* THIS IS USED TO DISTINGUISH BETWEEN A REAL */ |
295 | | /* MINIMUM WHEN ALL VALUES ARE NOT MISSING */ |
296 | | /* AND A MINIMUM THAT HAS BEEN SET TO ZERO WHEN */ |
297 | | /* ALL VALUES ARE MISSING. 0 OTHERWISE. */ |
298 | | /* MISLLC = PERFORMS THE SAME FUNCTION FOR GROUP C THAT */ |
299 | | /* MISLLA AND MISLLB DO FOR GROUPS B AND C, */ |
300 | | /* RESPECTIVELY. */ |
301 | | /* IBXX2(J) = AN ARRAY THAT WHEN THIS ROUTINE IS FIRST ENTERED */ |
302 | | /* IS SET TO 2**J, J=0,30. IBXX2(30) = 2**30, WHICH */ |
303 | | /* IS THE LARGEST VALUE PACKABLE, BECAUSE 2**31 */ |
304 | | /* IS LARGER THAN THE INTEGER WORD SIZE. */ |
305 | | /* IFIRST = SET BY DATA STATEMENT TO 0. CHANGED TO 1 ON */ |
306 | | /* FIRST */ |
307 | | /* ENTRY WHEN IBXX2( ) IS FILLED. */ |
308 | | /* MINAK = KEEPS TRACK OF THE LOCATION IN IC( ) WHERE THE */ |
309 | | /* MINIMUM VALUE IN GROUP A IS LOCATED. */ |
310 | | /* MAXAK = DOES THE SAME AS MINAK, EXCEPT FOR THE MAXIMUM. */ |
311 | | /* MINBK = THE SAME AS MINAK FOR GROUP B. */ |
312 | | /* MAXBK = THE SAME AS MAXAK FOR GROUP B. */ |
313 | | /* MINCK = THE SAME AS MINAK FOR GROUP C. */ |
314 | | /* MAXCK = THE SAME AS MAXAK FOR GROUP C. */ |
315 | | /* ADDA = KEEPS TRACK WHETHER OR NOT AN ATTEMPT TO ADD */ |
316 | | /* POINTS TO GROUP A WAS MADE. IF SO, THEN ADDA */ |
317 | | /* KEEPS FROM TRYING TO PUT ONE BACK INTO B. */ |
318 | | /* (LOGICAL) */ |
319 | | /* IBITBS = KEEPS CURRENT VALUE IF IBITB SO THAT LOOP */ |
320 | | /* ENDING AT 166 DOESN'T HAVE TO START AT */ |
321 | | /* IBITB = 0 EVERY TIME. */ |
322 | | /* MISSLX(J) = MALLOW EXCEPT WHEN A GROUP IS ALL ONE VALUE (AND */ |
323 | | /* LBIT(J) = 0) AND THAT VALUE IS MISSING. IN */ |
324 | | /* THAT CASE, MISSLX(J) IS MISSP OR MISSS. THIS */ |
325 | | /* GETS INSERTED INTO JMIN(J) LATER AS THE */ |
326 | | /* MISSING INDICATOR; IT CAN'T BE PUT IN UNTIL */ |
327 | | /* THE END, BECAUSE JMIN( ) IS USED TO CALCULATE */ |
328 | | /* THE MAXIMUM NUMBER OF BITS (IBITS) NEEDED TO */ |
329 | | /* PACK JMIN( ). */ |
330 | | /* 1 2 3 4 5 6 7 X */ |
331 | | |
332 | | /* NON SYSTEM SUBROUTINES CALLED */ |
333 | | /* NONE */ |
334 | | |
335 | | |
336 | | |
337 | | /* MISSLX( ) was AN AUTOMATIC ARRAY. */ |
338 | 946 | misslx = (integer *)calloc(*ndg,sizeof(integer)); |
339 | 946 | if( misslx == NULL ) |
340 | 0 | { |
341 | 0 | *ier = -1; |
342 | 0 | return 0; |
343 | 0 | } |
344 | | |
345 | | /* Parameter adjustments */ |
346 | 946 | --ic; |
347 | 946 | --nov; |
348 | 946 | --lbit; |
349 | 946 | --jmax; |
350 | 946 | --jmin; |
351 | | |
352 | | /* Function Body */ |
353 | | |
354 | 946 | *ier = 0; |
355 | 946 | iersav = 0; |
356 | | /* CALL TIMPR(KFILDO,KFILDO,'START PACK_GP ') */ |
357 | 946 | *(unsigned char *)cfeed = (char) ifeed; |
358 | | |
359 | 946 | ired = 0; |
360 | | /* IRED IS A FLAG. WHEN ZERO, REDUCE WILL BE CALLED. */ |
361 | | /* IF REDUCE ABORTS, IRED = 1 AND IS NOT CALLED. IN */ |
362 | | /* THIS CASE PACK_GP EXECUTES AGAIN EXCEPT FOR REDUCE. */ |
363 | | |
364 | 946 | if (*inc <= 0) { |
365 | 0 | iersav = 717; |
366 | | /* WRITE(KFILDO,101)INC */ |
367 | | /* 101 FORMAT(/' ****INC ='I8,' NOT CORRECT IN PACK_GP. 1 IS USED.') */ |
368 | 0 | } |
369 | | |
370 | | /* THERE WILL BE A RESTART OF PACK_GP IF SUBROUTINE REDUCE */ |
371 | | /* ABORTS. THIS SHOULD NOT HAPPEN, BUT IF IT DOES, PACK_GP */ |
372 | | /* WILL COMPLETE WITHOUT SUBROUTINE REDUCE. A NON FATAL */ |
373 | | /* DIAGNOSTIC RETURN IS PROVIDED. */ |
374 | | |
375 | 946 | L102: |
376 | | /*kinc = max(*inc,1);*/ |
377 | 946 | kinc = (*inc > 1) ? *inc : 1; |
378 | 946 | lminpk = *minpk; |
379 | | |
380 | | /* CALCULATE THE POWERS OF 2 THE FIRST TIME ENTERED. */ |
381 | | |
382 | 946 | if (ifirst == 0) { |
383 | 946 | ifirst = 1; |
384 | 946 | ibxx2[0] = 1; |
385 | | |
386 | 29.3k | for (j = 1; j <= 30; ++j) { |
387 | 28.3k | ibxx2[j] = ibxx2[j - 1] << 1; |
388 | | /* L104: */ |
389 | 28.3k | } |
390 | | |
391 | 946 | } |
392 | | |
393 | | /* THERE WILL BE A RESTART AT 105 IS NDG IS NOT LARGE ENOUGH. */ |
394 | | /* A NON FATAL DIAGNOSTIC RETURN IS PROVIDED. */ |
395 | | |
396 | 946 | L105: |
397 | 946 | kstart = 1; |
398 | 946 | ktotal = 0; |
399 | 946 | *lx = 0; |
400 | 946 | adda = FALSE_; |
401 | 946 | lmiss = 0; |
402 | 946 | if (*is523 == 1) { |
403 | 946 | lmiss = 1; |
404 | 946 | } |
405 | 946 | if (*is523 == 2) { |
406 | 0 | lmiss = 2; |
407 | 0 | } |
408 | | |
409 | | /* ************************************* */ |
410 | | |
411 | | /* THIS SECTION COMPUTES STATISTICS FOR GROUP A. GROUP A IS */ |
412 | | /* A GROUP OF SIZE LMINPK. */ |
413 | | |
414 | | /* ************************************* */ |
415 | | |
416 | 946 | ibita = 0; |
417 | 946 | mina = mallow; |
418 | 946 | maxa = -mallow; |
419 | 946 | minak = mallow; |
420 | 946 | maxak = -mallow; |
421 | | |
422 | | /* FIND THE MIN AND MAX OF GROUP A. THIS WILL INITIALLY BE OF */ |
423 | | /* SIZE LMINPK (IF THERE ARE STILL LMINPK VALUES IN IC( )), BUT */ |
424 | | /* WILL INCREASE IN SIZE IN INCREMENTS OF INC UNTIL A NEW */ |
425 | | /* GROUP IS STARTED. THE DEFINITION OF GROUP A IS DONE HERE */ |
426 | | /* ONLY ONCE (UPON INITIAL ENTRY), BECAUSE A GROUP B CAN ALWAYS */ |
427 | | /* BECOME A NEW GROUP A AFTER A IS PACKED, EXCEPT IF LMINPK */ |
428 | | /* HAS TO BE INCREASED BECAUSE NDG IS TOO SMALL. THEREFORE, */ |
429 | | /* THE SEPARATE LOOPS FOR MISSING AND NON-MISSING HERE BUYS */ |
430 | | /* ALMOST NOTHING. */ |
431 | | |
432 | | /* Computing MIN */ |
433 | 946 | i__1 = kstart + lminpk - 1; |
434 | | /*nenda = min(i__1,*nxy);*/ |
435 | 946 | nenda = (i__1 < *nxy) ? i__1 : *nxy; |
436 | 946 | if (*nxy - nenda <= lminpk / 2) { |
437 | 0 | nenda = *nxy; |
438 | 0 | } |
439 | | /* ABOVE STATEMENT GUARANTEES THE LAST GROUP IS GT LMINPK/2 BY */ |
440 | | /* MAKING THE ACTUAL GROUP LARGER. IF A PROVISION LIKE THIS IS */ |
441 | | /* NOT INCLUDED, THERE WILL MANY TIMES BE A VERY SMALL GROUP */ |
442 | | /* AT THE END. USE SEPARATE LOOPS FOR MISSING AND NO MISSING */ |
443 | | /* VALUES FOR EFFICIENCY. */ |
444 | | |
445 | | /* DETERMINE WHETHER THERE IS A LONG STRING OF THE SAME VALUE */ |
446 | | /* UNLESS NENDA = NXY. THIS MAY ALLOW A LARGE GROUP A TO */ |
447 | | /* START WITH, AS WITH MISSING VALUES. SEPARATE LOOPS FOR */ |
448 | | /* MISSING OPTIONS. THIS SECTION IS ONLY EXECUTED ONCE, */ |
449 | | /* IN DETERMINING THE FIRST GROUP. IT HELPS FOR AN ARRAY */ |
450 | | /* OF MOSTLY MISSING VALUES OR OF ONE VALUE, SUCH AS */ |
451 | | /* RADAR OR PRECIP DATA. */ |
452 | | |
453 | 946 | if (nenda != *nxy && ic[kstart] == ic[kstart + 1]) { |
454 | | /* NO NEED TO EXECUTE IF FIRST TWO VALUES ARE NOT EQUAL. */ |
455 | | |
456 | 945 | if (*is523 == 0) { |
457 | | /* THIS LOOP IS FOR NO MISSING VALUES. */ |
458 | |
|
459 | 0 | i__1 = *nxy; |
460 | 0 | for (k = kstart + 1; k <= i__1; ++k) { |
461 | |
|
462 | 0 | if (ic[k] != ic[kstart]) { |
463 | | /* Computing MAX */ |
464 | 0 | i__2 = nenda; |
465 | 0 | i__3 = k - 1; |
466 | | /*nenda = max(i__2,i__3);*/ |
467 | 0 | nenda = (i__2 > i__3) ? i__2 : i__3; |
468 | 0 | goto L114; |
469 | 0 | } |
470 | | |
471 | | /* L111: */ |
472 | 0 | } |
473 | | |
474 | 0 | nenda = *nxy; |
475 | | /* FALL THROUGH THE LOOP MEANS ALL VALUES ARE THE SAME. */ |
476 | |
|
477 | 945 | } else if (*is523 == 1) { |
478 | | /* THIS LOOP IS FOR PRIMARY MISSING VALUES ONLY. */ |
479 | | |
480 | 945 | i__1 = *nxy; |
481 | 6.68k | for (k = kstart + 1; k <= i__1; ++k) { |
482 | | |
483 | 6.68k | if (ic[k] != *missp) { |
484 | | |
485 | 6.68k | if (ic[k] != ic[kstart]) { |
486 | | /* Computing MAX */ |
487 | 945 | i__2 = nenda; |
488 | 945 | i__3 = k - 1; |
489 | | /*nenda = max(i__2,i__3);*/ |
490 | 945 | nenda = (i__2 > i__3) ? i__2 : i__3; |
491 | 945 | goto L114; |
492 | 945 | } |
493 | | |
494 | 6.68k | } |
495 | | |
496 | | /* L112: */ |
497 | 6.68k | } |
498 | | |
499 | 0 | nenda = *nxy; |
500 | | /* FALL THROUGH THE LOOP MEANS ALL VALUES ARE THE SAME. */ |
501 | |
|
502 | 0 | } else { |
503 | | /* THIS LOOP IS FOR PRIMARY AND SECONDARY MISSING VALUES. */ |
504 | |
|
505 | 0 | i__1 = *nxy; |
506 | 0 | for (k = kstart + 1; k <= i__1; ++k) { |
507 | |
|
508 | 0 | if (ic[k] != *missp && ic[k] != *misss) { |
509 | |
|
510 | 0 | if (ic[k] != ic[kstart]) { |
511 | | /* Computing MAX */ |
512 | 0 | i__2 = nenda; |
513 | 0 | i__3 = k - 1; |
514 | | /*nenda = max(i__2,i__3);*/ |
515 | 0 | nenda = (i__2 > i__3) ? i__2 : i__3; |
516 | 0 | goto L114; |
517 | 0 | } |
518 | |
|
519 | 0 | } |
520 | | |
521 | | /* L113: */ |
522 | 0 | } |
523 | | |
524 | 0 | nenda = *nxy; |
525 | | /* FALL THROUGH THE LOOP MEANS ALL VALUES ARE THE SAME. */ |
526 | 0 | } |
527 | | |
528 | 945 | } |
529 | | |
530 | 946 | L114: |
531 | 946 | if (*is523 == 0) { |
532 | |
|
533 | 0 | i__1 = nenda; |
534 | 0 | for (k = kstart; k <= i__1; ++k) { |
535 | 0 | if (ic[k] < mina) { |
536 | 0 | mina = ic[k]; |
537 | 0 | minak = k; |
538 | 0 | } |
539 | 0 | if (ic[k] > maxa) { |
540 | 0 | maxa = ic[k]; |
541 | 0 | maxak = k; |
542 | 0 | } |
543 | | /* L115: */ |
544 | 0 | } |
545 | |
|
546 | 946 | } else if (*is523 == 1) { |
547 | | |
548 | 946 | i__1 = nenda; |
549 | 10.6k | for (k = kstart; k <= i__1; ++k) { |
550 | 9.74k | if (ic[k] == *missp) { |
551 | 7 | goto L117; |
552 | 7 | } |
553 | 9.73k | if (ic[k] < mina) { |
554 | 1.29k | mina = ic[k]; |
555 | 1.29k | minak = k; |
556 | 1.29k | } |
557 | 9.73k | if (ic[k] > maxa) { |
558 | 1.49k | maxa = ic[k]; |
559 | 1.49k | maxak = k; |
560 | 1.49k | } |
561 | 9.74k | L117: |
562 | 9.74k | ; |
563 | 9.74k | } |
564 | | |
565 | 946 | } else { |
566 | |
|
567 | 0 | i__1 = nenda; |
568 | 0 | for (k = kstart; k <= i__1; ++k) { |
569 | 0 | if (ic[k] == *missp || ic[k] == *misss) { |
570 | 0 | goto L120; |
571 | 0 | } |
572 | 0 | if (ic[k] < mina) { |
573 | 0 | mina = ic[k]; |
574 | 0 | minak = k; |
575 | 0 | } |
576 | 0 | if (ic[k] > maxa) { |
577 | 0 | maxa = ic[k]; |
578 | 0 | maxak = k; |
579 | 0 | } |
580 | 0 | L120: |
581 | 0 | ; |
582 | 0 | } |
583 | |
|
584 | 0 | } |
585 | | |
586 | 946 | kounta = nenda - kstart + 1; |
587 | | |
588 | | /* INCREMENT KTOTAL AND FIND THE BITS NEEDED TO PACK THE A GROUP. */ |
589 | | |
590 | 946 | ktotal += kounta; |
591 | 946 | mislla = 0; |
592 | 946 | if (mina != mallow) { |
593 | 946 | goto L125; |
594 | 946 | } |
595 | | /* ALL MISSING VALUES MUST BE ACCOMMODATED. */ |
596 | 0 | mina = 0; |
597 | 0 | maxa = 0; |
598 | 0 | mislla = 1; |
599 | 0 | ibitb = 0; |
600 | 0 | if (*is523 != 2) { |
601 | 0 | goto L130; |
602 | 0 | } |
603 | | /* WHEN ALL VALUES ARE MISSING AND THERE ARE NO */ |
604 | | /* SECONDARY MISSING VALUES, IBITA = 0. */ |
605 | | /* OTHERWISE, IBITA MUST BE CALCULATED. */ |
606 | | |
607 | 946 | L125: |
608 | 946 | itest = maxa - mina + lmiss; |
609 | | |
610 | 6.98k | for (ibita = 0; ibita <= 30; ++ibita) { |
611 | 6.98k | if (itest < ibxx2[ibita]) { |
612 | 945 | goto L130; |
613 | 945 | } |
614 | | /* *** THIS TEST IS THE SAME AS: */ |
615 | | /* *** IF(MAXA-MINA.LT.IBXX2(IBITA)-LMISS)GO TO 130 */ |
616 | | /* L126: */ |
617 | 6.98k | } |
618 | | |
619 | | /* WRITE(KFILDO,127)MAXA,MINA */ |
620 | | /* 127 FORMAT(' ****ERROR IN PACK_GP. VALUE WILL NOT PACK IN 30 BITS.', */ |
621 | | /* 1 ' MAXA ='I13,' MINA ='I13,'. ERROR AT 127.') */ |
622 | 1 | *ier = 706; |
623 | 1 | goto L900; |
624 | | |
625 | 945 | L130: |
626 | | |
627 | | /* ***D WRITE(KFILDO,131)KOUNTA,KTOTAL,MINA,MAXA,IBITA,MISLLA */ |
628 | | /* ***D131 FORMAT(' AT 130, KOUNTA ='I8,' KTOTAL ='I8,' MINA ='I8, */ |
629 | | /* ***D 1 ' MAXA ='I8,' IBITA ='I3,' MISLLA ='I3) */ |
630 | | |
631 | 55.7k | L133: |
632 | 55.7k | if (ktotal >= *nxy) { |
633 | 1 | goto L200; |
634 | 1 | } |
635 | | |
636 | | /* ************************************* */ |
637 | | |
638 | | /* THIS SECTION COMPUTES STATISTICS FOR GROUP B. GROUP B IS A */ |
639 | | /* GROUP OF SIZE LMINPK IMMEDIATELY FOLLOWING GROUP A. */ |
640 | | |
641 | | /* ************************************* */ |
642 | | |
643 | 111k | L140: |
644 | 111k | minb = mallow; |
645 | 111k | maxb = -mallow; |
646 | 111k | minbk = mallow; |
647 | 111k | maxbk = -mallow; |
648 | 111k | ibitbs = 0; |
649 | 111k | mstart = ktotal + 1; |
650 | | |
651 | | /* DETERMINE WHETHER THERE IS A LONG STRING OF THE SAME VALUE. */ |
652 | | /* THIS WORKS WHEN THERE ARE NO MISSING VALUES. */ |
653 | | |
654 | 111k | nendb = 1; |
655 | | |
656 | 111k | if (mstart < *nxy) { |
657 | | |
658 | 111k | if (*is523 == 0) { |
659 | | /* THIS LOOP IS FOR NO MISSING VALUES. */ |
660 | |
|
661 | 0 | i__1 = *nxy; |
662 | 0 | for (k = mstart + 1; k <= i__1; ++k) { |
663 | |
|
664 | 0 | if (ic[k] != ic[mstart]) { |
665 | 0 | nendb = k - 1; |
666 | 0 | goto L150; |
667 | 0 | } |
668 | | |
669 | | /* L145: */ |
670 | 0 | } |
671 | | |
672 | 0 | nendb = *nxy; |
673 | | /* FALL THROUGH THE LOOP MEANS ALL REMAINING VALUES */ |
674 | | /* ARE THE SAME. */ |
675 | 0 | } |
676 | | |
677 | 111k | } |
678 | | |
679 | 398k | L150: |
680 | | /* Computing MAX */ |
681 | | /* Computing MIN */ |
682 | 398k | i__3 = ktotal + lminpk; |
683 | | /*i__1 = nendb, i__2 = min(i__3,*nxy);*/ |
684 | 398k | i__1 = nendb; |
685 | 398k | i__2 = (i__3 < *nxy) ? i__3 : *nxy; |
686 | | /*nendb = max(i__1,i__2);*/ |
687 | 398k | nendb = (i__1 > i__2) ? i__1 : i__2; |
688 | | /* **** 150 NENDB=MIN(KTOTAL+LMINPK,NXY) */ |
689 | | |
690 | 398k | if (*nxy - nendb <= lminpk / 2) { |
691 | 7.37k | nendb = *nxy; |
692 | 7.37k | } |
693 | | /* ABOVE STATEMENT GUARANTEES THE LAST GROUP IS GT LMINPK/2 BY */ |
694 | | /* MAKING THE ACTUAL GROUP LARGER. IF A PROVISION LIKE THIS IS */ |
695 | | /* NOT INCLUDED, THERE WILL MANY TIMES BE A VERY SMALL GROUP */ |
696 | | /* AT THE END. USE SEPARATE LOOPS FOR MISSING AND NO MISSING */ |
697 | | |
698 | | /* USE SEPARATE LOOPS FOR MISSING AND NO MISSING VALUES */ |
699 | | /* FOR EFFICIENCY. */ |
700 | | |
701 | 398k | if (*is523 == 0) { |
702 | |
|
703 | 0 | i__1 = nendb; |
704 | 0 | for (k = mstart; k <= i__1; ++k) { |
705 | 0 | if (ic[k] <= minb) { |
706 | 0 | minb = ic[k]; |
707 | | /* NOTE LE, NOT LT. LT COULD BE USED BUT THEN A */ |
708 | | /* RECOMPUTE OVER THE WHOLE GROUP WOULD BE NEEDED */ |
709 | | /* MORE OFTEN. SAME REASONING FOR GE AND OTHER */ |
710 | | /* LOOPS BELOW. */ |
711 | 0 | minbk = k; |
712 | 0 | } |
713 | 0 | if (ic[k] >= maxb) { |
714 | 0 | maxb = ic[k]; |
715 | 0 | maxbk = k; |
716 | 0 | } |
717 | | /* L155: */ |
718 | 0 | } |
719 | |
|
720 | 398k | } else if (*is523 == 1) { |
721 | | |
722 | 398k | i__1 = nendb; |
723 | 1.79M | for (k = mstart; k <= i__1; ++k) { |
724 | 1.40M | if (ic[k] == *missp) { |
725 | 32.7k | goto L157; |
726 | 32.7k | } |
727 | 1.36M | if (ic[k] <= minb) { |
728 | 658k | minb = ic[k]; |
729 | 658k | minbk = k; |
730 | 658k | } |
731 | 1.36M | if (ic[k] >= maxb) { |
732 | 606k | maxb = ic[k]; |
733 | 606k | maxbk = k; |
734 | 606k | } |
735 | 1.40M | L157: |
736 | 1.40M | ; |
737 | 1.40M | } |
738 | | |
739 | 398k | } else { |
740 | |
|
741 | 0 | i__1 = nendb; |
742 | 0 | for (k = mstart; k <= i__1; ++k) { |
743 | 0 | if (ic[k] == *missp || ic[k] == *misss) { |
744 | 0 | goto L160; |
745 | 0 | } |
746 | 0 | if (ic[k] <= minb) { |
747 | 0 | minb = ic[k]; |
748 | 0 | minbk = k; |
749 | 0 | } |
750 | 0 | if (ic[k] >= maxb) { |
751 | 0 | maxb = ic[k]; |
752 | 0 | maxbk = k; |
753 | 0 | } |
754 | 0 | L160: |
755 | 0 | ; |
756 | 0 | } |
757 | |
|
758 | 0 | } |
759 | | |
760 | 398k | kountb = nendb - ktotal; |
761 | 398k | misllb = 0; |
762 | 398k | if (minb != mallow) { |
763 | 398k | goto L165; |
764 | 398k | } |
765 | | /* ALL MISSING VALUES MUST BE ACCOMMODATED. */ |
766 | 219 | minb = 0; |
767 | 219 | maxb = 0; |
768 | 219 | misllb = 1; |
769 | 219 | ibitb = 0; |
770 | | |
771 | 219 | if (*is523 != 2) { |
772 | 219 | goto L170; |
773 | 219 | } |
774 | | /* WHEN ALL VALUES ARE MISSING AND THERE ARE NO SECONDARY */ |
775 | | /* MISSING VALUES, IBITB = 0. OTHERWISE, IBITB MUST BE */ |
776 | | /* CALCULATED. */ |
777 | | |
778 | 398k | L165: |
779 | 398k | if( (GIntBig)maxb - minb < INT_MIN || |
780 | 398k | (GIntBig)maxb - minb > INT_MAX ) |
781 | 0 | { |
782 | 0 | *ier = -1; |
783 | 0 | free(misslx); |
784 | 0 | return 0; |
785 | 0 | } |
786 | | |
787 | 1.20M | for (ibitb = ibitbs; ibitb <= 30; ++ibitb) { |
788 | 1.20M | if (maxb - minb < ibxx2[ibitb] - lmiss) { |
789 | 398k | goto L170; |
790 | 398k | } |
791 | | /* L166: */ |
792 | 1.20M | } |
793 | | |
794 | | /* WRITE(KFILDO,167)MAXB,MINB */ |
795 | | /* 167 FORMAT(' ****ERROR IN PACK_GP. VALUE WILL NOT PACK IN 30 BITS.', */ |
796 | | /* 1 ' MAXB ='I13,' MINB ='I13,'. ERROR AT 167.') */ |
797 | 0 | *ier = 706; |
798 | 0 | goto L900; |
799 | | |
800 | | /* COMPARE THE BITS NEEDED TO PACK GROUP B WITH THOSE NEEDED */ |
801 | | /* TO PACK GROUP A. IF IBITB GE IBITA, TRY TO ADD TO GROUP A. */ |
802 | | /* IF NOT, TRY TO ADD A'S POINTS TO B, UNLESS ADDITION TO A */ |
803 | | /* HAS BEEN DONE. THIS LATTER IS CONTROLLED WITH ADDA. */ |
804 | | |
805 | 398k | L170: |
806 | | |
807 | | /* ***D WRITE(KFILDO,171)KOUNTA,KTOTAL,MINA,MAXA,IBITA,MISLLA, */ |
808 | | /* ***D 1 MINB,MAXB,IBITB,MISLLB */ |
809 | | /* ***D171 FORMAT(' AT 171, KOUNTA ='I8,' KTOTAL ='I8,' MINA ='I8, */ |
810 | | /* ***D 1 ' MAXA ='I8,' IBITA ='I3,' MISLLA ='I3, */ |
811 | | /* ***D 2 ' MINB ='I8,' MAXB ='I8,' IBITB ='I3,' MISLLB ='I3) */ |
812 | | |
813 | 398k | if (ibitb >= ibita) { |
814 | 373k | goto L180; |
815 | 373k | } |
816 | 25.0k | if (adda) { |
817 | 15.1k | goto L200; |
818 | 15.1k | } |
819 | | |
820 | | /* ************************************* */ |
821 | | |
822 | | /* GROUP B REQUIRES LESS BITS THAN GROUP A. PUT AS MANY OF A'S */ |
823 | | /* POINTS INTO B AS POSSIBLE WITHOUT EXCEEDING THE NUMBER OF */ |
824 | | /* BITS NECESSARY TO PACK GROUP B. */ |
825 | | |
826 | | /* ************************************* */ |
827 | | |
828 | 9.87k | kounts = kounta; |
829 | | /* KOUNTA REFERS TO THE PRESENT GROUP A. */ |
830 | 9.87k | mintst = minb; |
831 | 9.87k | maxtst = maxb; |
832 | 9.87k | mintstk = minbk; |
833 | 9.87k | maxtstk = maxbk; |
834 | | |
835 | | /* USE SEPARATE LOOPS FOR MISSING AND NO MISSING VALUES */ |
836 | | /* FOR EFFICIENCY. */ |
837 | | |
838 | 9.87k | if (*is523 == 0) { |
839 | |
|
840 | 0 | i__1 = kstart; |
841 | 0 | for (k = ktotal; k >= i__1; --k) { |
842 | | /* START WITH THE END OF THE GROUP AND WORK BACKWARDS. */ |
843 | 0 | if (ic[k] < minb) { |
844 | 0 | mintst = ic[k]; |
845 | 0 | mintstk = k; |
846 | 0 | } else if (ic[k] > maxb) { |
847 | 0 | maxtst = ic[k]; |
848 | 0 | maxtstk = k; |
849 | 0 | } |
850 | 0 | if (maxtst - mintst >= ibxx2[ibitb]) { |
851 | 0 | goto L174; |
852 | 0 | } |
853 | | /* NOTE THAT FOR THIS LOOP, LMISS = 0. */ |
854 | 0 | minb = mintst; |
855 | 0 | maxb = maxtst; |
856 | 0 | minbk = mintstk; |
857 | 0 | maxbk = maxtstk; |
858 | 0 | --kounta; |
859 | | /* THERE IS ONE LESS POINT NOW IN A. */ |
860 | | /* L1715: */ |
861 | 0 | } |
862 | |
|
863 | 9.87k | } else if (*is523 == 1) { |
864 | | |
865 | 9.87k | i__1 = kstart; |
866 | 53.0k | for (k = ktotal; k >= i__1; --k) { |
867 | | /* START WITH THE END OF THE GROUP AND WORK BACKWARDS. */ |
868 | 53.0k | if (ic[k] == *missp) { |
869 | 1.53k | goto L1718; |
870 | 1.53k | } |
871 | 51.4k | if (ic[k] < minb) { |
872 | 4.91k | mintst = ic[k]; |
873 | 4.91k | mintstk = k; |
874 | 46.5k | } else if (ic[k] > maxb) { |
875 | 5.66k | maxtst = ic[k]; |
876 | 5.66k | maxtstk = k; |
877 | 5.66k | } |
878 | 51.4k | if (maxtst - mintst >= ibxx2[ibitb] - lmiss) { |
879 | 9.87k | goto L174; |
880 | 9.87k | } |
881 | | /* FOR THIS LOOP, LMISS = 1. */ |
882 | 41.5k | minb = mintst; |
883 | 41.5k | maxb = maxtst; |
884 | 41.5k | minbk = mintstk; |
885 | 41.5k | maxbk = maxtstk; |
886 | 41.5k | misllb = 0; |
887 | | /* WHEN THE POINT IS NON MISSING, MISLLB SET = 0. */ |
888 | 43.1k | L1718: |
889 | 43.1k | --kounta; |
890 | | /* THERE IS ONE LESS POINT NOW IN A. */ |
891 | | /* L1719: */ |
892 | 43.1k | } |
893 | | |
894 | 9.87k | } else { |
895 | |
|
896 | 0 | i__1 = kstart; |
897 | 0 | for (k = ktotal; k >= i__1; --k) { |
898 | | /* START WITH THE END OF THE GROUP AND WORK BACKWARDS. */ |
899 | 0 | if (ic[k] == *missp || ic[k] == *misss) { |
900 | 0 | goto L1729; |
901 | 0 | } |
902 | 0 | if (ic[k] < minb) { |
903 | 0 | mintst = ic[k]; |
904 | 0 | mintstk = k; |
905 | 0 | } else if (ic[k] > maxb) { |
906 | 0 | maxtst = ic[k]; |
907 | 0 | maxtstk = k; |
908 | 0 | } |
909 | 0 | if (maxtst - mintst >= ibxx2[ibitb] - lmiss) { |
910 | 0 | goto L174; |
911 | 0 | } |
912 | | /* FOR THIS LOOP, LMISS = 2. */ |
913 | 0 | minb = mintst; |
914 | 0 | maxb = maxtst; |
915 | 0 | minbk = mintstk; |
916 | 0 | maxbk = maxtstk; |
917 | 0 | misllb = 0; |
918 | | /* WHEN THE POINT IS NON MISSING, MISLLB SET = 0. */ |
919 | 0 | L1729: |
920 | 0 | --kounta; |
921 | | /* THERE IS ONE LESS POINT NOW IN A. */ |
922 | | /* L173: */ |
923 | 0 | } |
924 | |
|
925 | 0 | } |
926 | | |
927 | | /* AT THIS POINT, KOUNTA CONTAINS THE NUMBER OF POINTS TO CLOSE */ |
928 | | /* OUT GROUP A WITH. GROUP B NOW STARTS WITH KSTART+KOUNTA AND */ |
929 | | /* ENDS WITH NENDB. MINB AND MAXB HAVE BEEN ADJUSTED AS */ |
930 | | /* NECESSARY TO REFLECT GROUP B (EVEN THOUGH THE NUMBER OF BITS */ |
931 | | /* NEEDED TO PACK GROUP B HAVE NOT INCREASED, THE END POINTS */ |
932 | | /* OF THE RANGE MAY HAVE). */ |
933 | | |
934 | 9.87k | L174: |
935 | 9.87k | if (kounta == kounts) { |
936 | 663 | goto L200; |
937 | 663 | } |
938 | | /* ON TRANSFER, GROUP A WAS NOT CHANGED. CLOSE IT OUT. */ |
939 | | |
940 | | /* ONE OR MORE POINTS WERE TAKEN OUT OF A. RANGE AND IBITA */ |
941 | | /* MAY HAVE TO BE RECOMPUTED; IBITA COULD BE LESS THAN */ |
942 | | /* ORIGINALLY COMPUTED. IN FACT, GROUP A CAN NOW CONTAIN */ |
943 | | /* ONLY ONE POINT AND BE PACKED WITH ZERO BITS */ |
944 | | /* (UNLESS MISSS NE 0). */ |
945 | | |
946 | 9.21k | nouta = kounts - kounta; |
947 | 9.21k | ktotal -= nouta; |
948 | 9.21k | kountb += nouta; |
949 | 9.21k | if (nenda - nouta > minak && nenda - nouta > maxak) { |
950 | 222 | goto L200; |
951 | 222 | } |
952 | | /* WHEN THE ABOVE TEST IS MET, THE MIN AND MAX OF THE */ |
953 | | /* CURRENT GROUP A WERE WITHIN THE OLD GROUP A, SO THE */ |
954 | | /* RANGE AND IBITA DO NOT NEED TO BE RECOMPUTED. */ |
955 | | /* NOTE THAT MINAK AND MAXAK ARE NO LONGER NEEDED. */ |
956 | 8.99k | ibita = 0; |
957 | 8.99k | mina = mallow; |
958 | 8.99k | maxa = -mallow; |
959 | | |
960 | | /* USE SEPARATE LOOPS FOR MISSING AND NO MISSING VALUES */ |
961 | | /* FOR EFFICIENCY. */ |
962 | | |
963 | 8.99k | if (*is523 == 0) { |
964 | |
|
965 | 0 | i__1 = nenda - nouta; |
966 | 0 | for (k = kstart; k <= i__1; ++k) { |
967 | 0 | if (ic[k] < mina) { |
968 | 0 | mina = ic[k]; |
969 | 0 | } |
970 | 0 | if (ic[k] > maxa) { |
971 | 0 | maxa = ic[k]; |
972 | 0 | } |
973 | | /* L1742: */ |
974 | 0 | } |
975 | |
|
976 | 8.99k | } else if (*is523 == 1) { |
977 | | |
978 | 8.99k | i__1 = nenda - nouta; |
979 | 57.1k | for (k = kstart; k <= i__1; ++k) { |
980 | 48.1k | if (ic[k] == *missp) { |
981 | 700 | goto L1744; |
982 | 700 | } |
983 | 47.4k | if (ic[k] < mina) { |
984 | 15.3k | mina = ic[k]; |
985 | 15.3k | } |
986 | 47.4k | if (ic[k] > maxa) { |
987 | 14.1k | maxa = ic[k]; |
988 | 14.1k | } |
989 | 48.1k | L1744: |
990 | 48.1k | ; |
991 | 48.1k | } |
992 | | |
993 | 8.99k | } else { |
994 | |
|
995 | 0 | i__1 = nenda - nouta; |
996 | 0 | for (k = kstart; k <= i__1; ++k) { |
997 | 0 | if (ic[k] == *missp || ic[k] == *misss) { |
998 | 0 | goto L175; |
999 | 0 | } |
1000 | 0 | if (ic[k] < mina) { |
1001 | 0 | mina = ic[k]; |
1002 | 0 | } |
1003 | 0 | if (ic[k] > maxa) { |
1004 | 0 | maxa = ic[k]; |
1005 | 0 | } |
1006 | 0 | L175: |
1007 | 0 | ; |
1008 | 0 | } |
1009 | |
|
1010 | 0 | } |
1011 | | |
1012 | 8.99k | mislla = 0; |
1013 | 8.99k | if (mina != mallow) { |
1014 | 8.99k | goto L1750; |
1015 | 8.99k | } |
1016 | | /* ALL MISSING VALUES MUST BE ACCOMMODATED. */ |
1017 | 0 | mina = 0; |
1018 | 0 | maxa = 0; |
1019 | 0 | mislla = 1; |
1020 | 0 | if (*is523 != 2) { |
1021 | 0 | goto L177; |
1022 | 0 | } |
1023 | | /* WHEN ALL VALUES ARE MISSING AND THERE ARE NO SECONDARY */ |
1024 | | /* MISSING VALUES IBITA = 0 AS ORIGINALLY SET. OTHERWISE, */ |
1025 | | /* IBITA MUST BE CALCULATED. */ |
1026 | | |
1027 | 8.99k | L1750: |
1028 | 8.99k | itest = maxa - mina + lmiss; |
1029 | | |
1030 | 74.3k | for (ibita = 0; ibita <= 30; ++ibita) { |
1031 | 74.3k | if (itest < ibxx2[ibita]) { |
1032 | 8.99k | goto L177; |
1033 | 8.99k | } |
1034 | | /* *** THIS TEST IS THE SAME AS: */ |
1035 | | /* *** IF(MAXA-MINA.LT.IBXX2(IBITA)-LMISS)GO TO 177 */ |
1036 | | /* L176: */ |
1037 | 74.3k | } |
1038 | | |
1039 | | /* WRITE(KFILDO,1760)MAXA,MINA */ |
1040 | | /* 1760 FORMAT(' ****ERROR IN PACK_GP. VALUE WILL NOT PACK IN 30 BITS.', */ |
1041 | | /* 1 ' MAXA ='I13,' MINA ='I13,'. ERROR AT 1760.') */ |
1042 | 0 | *ier = 706; |
1043 | 0 | goto L900; |
1044 | | |
1045 | 8.99k | L177: |
1046 | 8.99k | goto L200; |
1047 | | |
1048 | | /* ************************************* */ |
1049 | | |
1050 | | /* AT THIS POINT, GROUP B REQUIRES AS MANY BITS TO PACK AS GROUPA. */ |
1051 | | /* THEREFORE, TRY TO ADD INC POINTS TO GROUP A WITHOUT INCREASING */ |
1052 | | /* IBITA. THIS AUGMENTED GROUP IS CALLED GROUP C. */ |
1053 | | |
1054 | | /* ************************************* */ |
1055 | | |
1056 | 373k | L180: |
1057 | 373k | if (mislla == 1) { |
1058 | 1.09k | minc = mallow; |
1059 | 1.09k | minck = mallow; |
1060 | 1.09k | maxc = -mallow; |
1061 | 1.09k | maxck = -mallow; |
1062 | 372k | } else { |
1063 | 372k | minc = mina; |
1064 | 372k | maxc = maxa; |
1065 | 372k | minck = minak; |
1066 | 372k | maxck = minak; |
1067 | 372k | } |
1068 | | |
1069 | 373k | nount = 0; |
1070 | 373k | if (*nxy - (ktotal + kinc) <= lminpk / 2) { |
1071 | 944 | kinc = *nxy - ktotal; |
1072 | 944 | } |
1073 | | /* ABOVE STATEMENT CONSTRAINS THE LAST GROUP TO BE NOT LESS THAN */ |
1074 | | /* LMINPK/2 IN SIZE. IF A PROVISION LIKE THIS IS NOT INCLUDED, */ |
1075 | | /* THERE WILL MANY TIMES BE A VERY SMALL GROUP AT THE END. */ |
1076 | | |
1077 | | /* USE SEPARATE LOOPS FOR MISSING AND NO MISSING VALUES */ |
1078 | | /* FOR EFFICIENCY. SINCE KINC IS USUALLY 1, USING SEPARATE */ |
1079 | | /* LOOPS HERE DOESN'T BUY MUCH. A MISSING VALUE WILL ALWAYS */ |
1080 | | /* TRANSFER BACK TO GROUP A. */ |
1081 | | |
1082 | 373k | if (*is523 == 0) { |
1083 | | |
1084 | | /* Computing MIN */ |
1085 | 0 | i__2 = ktotal + kinc; |
1086 | | /*i__1 = min(i__2,*nxy);*/ |
1087 | 0 | i__1 = (i__2 < *nxy) ? i__2 : *nxy; |
1088 | 0 | for (k = ktotal + 1; k <= i__1; ++k) { |
1089 | 0 | if (ic[k] < minc) { |
1090 | 0 | minc = ic[k]; |
1091 | 0 | minck = k; |
1092 | 0 | } |
1093 | 0 | if (ic[k] > maxc) { |
1094 | 0 | maxc = ic[k]; |
1095 | 0 | maxck = k; |
1096 | 0 | } |
1097 | 0 | ++nount; |
1098 | | /* L185: */ |
1099 | 0 | } |
1100 | |
|
1101 | 373k | } else if (*is523 == 1) { |
1102 | | |
1103 | | /* Computing MIN */ |
1104 | 373k | i__2 = ktotal + kinc; |
1105 | | /*i__1 = min(i__2,*nxy);*/ |
1106 | 373k | i__1 = (i__2 < *nxy) ? i__2 : *nxy; |
1107 | 751k | for (k = ktotal + 1; k <= i__1; ++k) { |
1108 | 378k | if (ic[k] == *missp) { |
1109 | 13.7k | goto L186; |
1110 | 13.7k | } |
1111 | 364k | if (ic[k] < minc) { |
1112 | 19.3k | minc = ic[k]; |
1113 | 19.3k | minck = k; |
1114 | 19.3k | } |
1115 | 364k | if (ic[k] > maxc) { |
1116 | 30.9k | maxc = ic[k]; |
1117 | 30.9k | maxck = k; |
1118 | 30.9k | } |
1119 | 378k | L186: |
1120 | 378k | ++nount; |
1121 | | /* L187: */ |
1122 | 378k | } |
1123 | | |
1124 | 373k | } else { |
1125 | | |
1126 | | /* Computing MIN */ |
1127 | 0 | i__2 = ktotal + kinc; |
1128 | | /*i__1 = min(i__2,*nxy);*/ |
1129 | 0 | i__1 = (i__2 < *nxy) ? i__2 : *nxy; |
1130 | 0 | for (k = ktotal + 1; k <= i__1; ++k) { |
1131 | 0 | if (ic[k] == *missp || ic[k] == *misss) { |
1132 | 0 | goto L189; |
1133 | 0 | } |
1134 | 0 | if (ic[k] < minc) { |
1135 | 0 | minc = ic[k]; |
1136 | 0 | minck = k; |
1137 | 0 | } |
1138 | 0 | if (ic[k] > maxc) { |
1139 | 0 | maxc = ic[k]; |
1140 | 0 | maxck = k; |
1141 | 0 | } |
1142 | 0 | L189: |
1143 | 0 | ++nount; |
1144 | | /* L190: */ |
1145 | 0 | } |
1146 | |
|
1147 | 0 | } |
1148 | | |
1149 | | /* ***D WRITE(KFILDO,191)KOUNTA,KTOTAL,MINA,MAXA,IBITA,MISLLA, */ |
1150 | | /* ***D 1 MINC,MAXC,NOUNT,IC(KTOTAL),IC(KTOTAL+1) */ |
1151 | | /* ***D191 FORMAT(' AT 191, KOUNTA ='I8,' KTOTAL ='I8,' MINA ='I8, */ |
1152 | | /* ***D 1 ' MAXA ='I8,' IBITA ='I3,' MISLLA ='I3, */ |
1153 | | /* ***D 2 ' MINC ='I8,' MAXC ='I8, */ |
1154 | | /* ***D 3 ' NOUNT ='I5,' IC(KTOTAL) ='I9,' IC(KTOTAL+1) =',I9) */ |
1155 | | |
1156 | | /* IF THE NUMBER OF BITS NEEDED FOR GROUP C IS GT IBITA, */ |
1157 | | /* THEN THIS GROUP A IS A GROUP TO PACK. */ |
1158 | | |
1159 | 373k | if (minc == mallow) { |
1160 | 876 | minc = mina; |
1161 | 876 | maxc = maxa; |
1162 | 876 | minck = minak; |
1163 | 876 | maxck = maxak; |
1164 | 876 | misllc = 1; |
1165 | 876 | goto L195; |
1166 | | /* WHEN THE NEW VALUE(S) ARE MISSING, THEY CAN ALWAYS */ |
1167 | | /* BE ADDED. */ |
1168 | | |
1169 | 372k | } else { |
1170 | 372k | misllc = 0; |
1171 | 372k | } |
1172 | | |
1173 | 372k | if (maxc - minc >= ibxx2[ibita] - lmiss) { |
1174 | 29.8k | goto L200; |
1175 | 29.8k | } |
1176 | | |
1177 | | /* THE BITS NECESSARY FOR GROUP C HAS NOT INCREASED FROM THE */ |
1178 | | /* BITS NECESSARY FOR GROUP A. ADD THIS POINT(S) TO GROUP A. */ |
1179 | | /* COMPUTE THE NEXT GROUP B, ETC., UNLESS ALL POINTS HAVE BEEN */ |
1180 | | /* USED. */ |
1181 | | |
1182 | 343k | L195: |
1183 | 343k | ktotal += nount; |
1184 | 343k | kounta += nount; |
1185 | 343k | mina = minc; |
1186 | 343k | maxa = maxc; |
1187 | 343k | minak = minck; |
1188 | 343k | maxak = maxck; |
1189 | 343k | mislla = misllc; |
1190 | 343k | adda = TRUE_; |
1191 | 343k | if (ktotal >= *nxy) { |
1192 | 944 | goto L200; |
1193 | 944 | } |
1194 | | |
1195 | 342k | if (minbk > ktotal && maxbk > ktotal) { |
1196 | 286k | mstart = nendb + 1; |
1197 | | /* THE MAX AND MIN OF GROUP B WERE NOT FROM THE POINTS */ |
1198 | | /* REMOVED, SO THE WHOLE GROUP DOES NOT HAVE TO BE LOOKED */ |
1199 | | /* AT TO DETERMINE THE NEW MAX AND MIN. RATHER START */ |
1200 | | /* JUST BEYOND THE OLD NENDB. */ |
1201 | 286k | ibitbs = ibitb; |
1202 | 286k | nendb = 1; |
1203 | 286k | goto L150; |
1204 | 286k | } else { |
1205 | 55.9k | goto L140; |
1206 | 55.9k | } |
1207 | | |
1208 | | /* ************************************* */ |
1209 | | |
1210 | | /* GROUP A IS TO BE PACKED. STORE VALUES IN JMIN( ), JMAX( ), */ |
1211 | | /* LBIT( ), AND NOV( ). */ |
1212 | | |
1213 | | /* ************************************* */ |
1214 | | |
1215 | 55.7k | L200: |
1216 | 55.7k | ++(*lx); |
1217 | 55.7k | if (*lx <= *ndg) { |
1218 | 55.7k | goto L205; |
1219 | 55.7k | } |
1220 | 0 | lminpk += lminpk / 2; |
1221 | | /* WRITE(KFILDO,201)NDG,LMINPK,LX */ |
1222 | | /* 201 FORMAT(' ****NDG ='I5,' NOT LARGE ENOUGH.', */ |
1223 | | /* 1 ' LMINPK IS INCREASED TO 'I3,' FOR THIS FIELD.'/ */ |
1224 | | /* 2 ' LX = 'I10) */ |
1225 | 0 | iersav = 716; |
1226 | 0 | goto L105; |
1227 | | |
1228 | 55.7k | L205: |
1229 | 55.7k | jmin[*lx] = mina; |
1230 | 55.7k | jmax[*lx] = maxa; |
1231 | 55.7k | lbit[*lx] = ibita; |
1232 | 55.7k | nov[*lx] = kounta; |
1233 | 55.7k | kstart = ktotal + 1; |
1234 | | |
1235 | 55.7k | if (mislla == 0) { |
1236 | 55.5k | misslx[*lx - 1] = mallow; |
1237 | 55.5k | } else { |
1238 | 219 | misslx[*lx - 1] = ic[ktotal]; |
1239 | | /* IC(KTOTAL) WAS THE LAST VALUE PROCESSED. IF MISLLA NE 0, */ |
1240 | | /* THIS MUST BE THE MISSING VALUE FOR THIS GROUP. */ |
1241 | 219 | } |
1242 | | |
1243 | | /* ***D WRITE(KFILDO,206)MISLLA,IC(KTOTAL),KTOTAL,LX,JMIN(LX),JMAX(LX), */ |
1244 | | /* ***D 1 LBIT(LX),NOV(LX),MISSLX(LX) */ |
1245 | | /* ***D206 FORMAT(' AT 206, MISLLA ='I2,' IC(KTOTAL) ='I5,' KTOTAL ='I8, */ |
1246 | | /* ***D 1 ' LX ='I6,' JMIN(LX) ='I8,' JMAX(LX) ='I8, */ |
1247 | | /* ***D 2 ' LBIT(LX) ='I5,' NOV(LX) ='I8,' MISSLX(LX) =',I7) */ |
1248 | | |
1249 | 55.7k | if (ktotal >= *nxy) { |
1250 | 945 | goto L209; |
1251 | 945 | } |
1252 | | |
1253 | | /* THE NEW GROUP A WILL BE THE PREVIOUS GROUP B. SET LIMITS, ETC. */ |
1254 | | |
1255 | 54.8k | ibita = ibitb; |
1256 | 54.8k | mina = minb; |
1257 | 54.8k | maxa = maxb; |
1258 | 54.8k | minak = minbk; |
1259 | 54.8k | maxak = maxbk; |
1260 | 54.8k | mislla = misllb; |
1261 | 54.8k | nenda = nendb; |
1262 | 54.8k | kounta = kountb; |
1263 | 54.8k | ktotal += kounta; |
1264 | 54.8k | adda = FALSE_; |
1265 | 54.8k | goto L133; |
1266 | | |
1267 | | /* ************************************* */ |
1268 | | |
1269 | | /* CALCULATE IBIT, THE NUMBER OF BITS NEEDED TO HOLD THE GROUP */ |
1270 | | /* MINIMUM VALUES. */ |
1271 | | |
1272 | | /* ************************************* */ |
1273 | | |
1274 | 945 | L209: |
1275 | 945 | *ibit = 0; |
1276 | | |
1277 | 945 | i__1 = *lx; |
1278 | 56.7k | for (l = 1; l <= i__1; ++l) { |
1279 | 63.3k | L210: |
1280 | 63.3k | if( *ibit == 31 ) |
1281 | 0 | { |
1282 | 0 | *ier = -1; |
1283 | 0 | goto L900; |
1284 | 0 | } |
1285 | 63.3k | if (jmin[l] < ibxx2[*ibit]) { |
1286 | 55.7k | goto L220; |
1287 | 55.7k | } |
1288 | 7.56k | ++(*ibit); |
1289 | 7.56k | goto L210; |
1290 | 55.7k | L220: |
1291 | 55.7k | ; |
1292 | 55.7k | } |
1293 | | |
1294 | | /* INSERT THE VALUE IN JMIN( ) TO BE USED FOR ALL MISSING */ |
1295 | | /* VALUES WHEN LBIT( ) = 0. WHEN SECONDARY MISSING */ |
1296 | | /* VALUES CAN BE PRESENT, LBIT(L) WILL NOT = 0. */ |
1297 | | |
1298 | 945 | if (*is523 == 1) { |
1299 | | |
1300 | 945 | i__1 = *lx; |
1301 | 56.7k | for (l = 1; l <= i__1; ++l) { |
1302 | | |
1303 | 55.7k | if (lbit[l] == 0) { |
1304 | | |
1305 | 219 | if (misslx[l - 1] == *missp) { |
1306 | 219 | jmin[l] = ibxx2[*ibit] - 1; |
1307 | 219 | } |
1308 | | |
1309 | 219 | } |
1310 | | |
1311 | | /* L226: */ |
1312 | 55.7k | } |
1313 | | |
1314 | 945 | } |
1315 | | |
1316 | | /* ************************************* */ |
1317 | | |
1318 | | /* CALCULATE JBIT, THE NUMBER OF BITS NEEDED TO HOLD THE BITS */ |
1319 | | /* NEEDED TO PACK THE VALUES IN THE GROUPS. BUT FIND AND */ |
1320 | | /* REMOVE THE REFERENCE VALUE FIRST. */ |
1321 | | |
1322 | | /* ************************************* */ |
1323 | | |
1324 | | /* WRITE(KFILDO,228)CFEED,LX */ |
1325 | | /* 228 FORMAT(A1,/' *****************************************' */ |
1326 | | /* 1 /' THE GROUP WIDTHS LBIT( ) FOR ',I8,' GROUPS' */ |
1327 | | /* 2 /' *****************************************') */ |
1328 | | /* WRITE(KFILDO,229) (LBIT(J),J=1,MIN(LX,100)) */ |
1329 | | /* 229 FORMAT(/' '20I6) */ |
1330 | | |
1331 | 945 | *lbitref = lbit[1]; |
1332 | | |
1333 | 945 | i__1 = *lx; |
1334 | 56.7k | for (k = 1; k <= i__1; ++k) { |
1335 | 55.7k | if (lbit[k] < *lbitref) { |
1336 | 1.66k | *lbitref = lbit[k]; |
1337 | 1.66k | } |
1338 | | /* L230: */ |
1339 | 55.7k | } |
1340 | | |
1341 | 945 | if (*lbitref != 0) { |
1342 | | |
1343 | 726 | i__1 = *lx; |
1344 | 42.9k | for (k = 1; k <= i__1; ++k) { |
1345 | 42.2k | lbit[k] -= *lbitref; |
1346 | | /* L240: */ |
1347 | 42.2k | } |
1348 | | |
1349 | 726 | } |
1350 | | |
1351 | | /* WRITE(KFILDO,241)CFEED,LBITREF */ |
1352 | | /* 241 FORMAT(A1,/' *****************************************' */ |
1353 | | /* 1 /' THE GROUP WIDTHS LBIT( ) AFTER REMOVING REFERENCE ', */ |
1354 | | /* 2 I8, */ |
1355 | | /* 3 /' *****************************************') */ |
1356 | | /* WRITE(KFILDO,242) (LBIT(J),J=1,MIN(LX,100)) */ |
1357 | | /* 242 FORMAT(/' '20I6) */ |
1358 | | |
1359 | 945 | *jbit = 0; |
1360 | | |
1361 | 945 | i__1 = *lx; |
1362 | 56.7k | for (k = 1; k <= i__1; ++k) { |
1363 | 58.8k | L310: |
1364 | 58.8k | if (lbit[k] < ibxx2[*jbit]) { |
1365 | 55.7k | goto L320; |
1366 | 55.7k | } |
1367 | 3.05k | ++(*jbit); |
1368 | 3.05k | goto L310; |
1369 | 55.7k | L320: |
1370 | 55.7k | ; |
1371 | 55.7k | } |
1372 | | |
1373 | | /* ************************************* */ |
1374 | | |
1375 | | /* CALCULATE KBIT, THE NUMBER OF BITS NEEDED TO HOLD THE NUMBER */ |
1376 | | /* OF VALUES IN THE GROUPS. BUT FIND AND REMOVE THE */ |
1377 | | /* REFERENCE FIRST. */ |
1378 | | |
1379 | | /* ************************************* */ |
1380 | | |
1381 | | /* WRITE(KFILDO,321)CFEED,LX */ |
1382 | | /* 321 FORMAT(A1,/' *****************************************' */ |
1383 | | /* 1 /' THE GROUP SIZES NOV( ) FOR ',I8,' GROUPS' */ |
1384 | | /* 2 /' *****************************************') */ |
1385 | | /* WRITE(KFILDO,322) (NOV(J),J=1,MIN(LX,100)) */ |
1386 | | /* 322 FORMAT(/' '20I6) */ |
1387 | | |
1388 | 945 | *novref = nov[1]; |
1389 | | |
1390 | 945 | i__1 = *lx; |
1391 | 56.7k | for (k = 1; k <= i__1; ++k) { |
1392 | 55.7k | if (nov[k] < *novref) { |
1393 | 2.19k | *novref = nov[k]; |
1394 | 2.19k | } |
1395 | | /* L400: */ |
1396 | 55.7k | } |
1397 | | |
1398 | 945 | if (*novref > 0) { |
1399 | | |
1400 | 945 | i__1 = *lx; |
1401 | 56.7k | for (k = 1; k <= i__1; ++k) { |
1402 | 55.7k | nov[k] -= *novref; |
1403 | | /* L405: */ |
1404 | 55.7k | } |
1405 | | |
1406 | 945 | } |
1407 | | |
1408 | | /* WRITE(KFILDO,406)CFEED,NOVREF */ |
1409 | | /* 406 FORMAT(A1,/' *****************************************' */ |
1410 | | /* 1 /' THE GROUP SIZES NOV( ) AFTER REMOVING REFERENCE ',I8, */ |
1411 | | /* 2 /' *****************************************') */ |
1412 | | /* WRITE(KFILDO,407) (NOV(J),J=1,MIN(LX,100)) */ |
1413 | | /* 407 FORMAT(/' '20I6) */ |
1414 | | /* WRITE(KFILDO,408)CFEED */ |
1415 | | /* 408 FORMAT(A1,/' *****************************************' */ |
1416 | | /* 1 /' THE GROUP REFERENCES JMIN( )' */ |
1417 | | /* 2 /' *****************************************') */ |
1418 | | /* WRITE(KFILDO,409) (JMIN(J),J=1,MIN(LX,100)) */ |
1419 | | /* 409 FORMAT(/' '20I6) */ |
1420 | | |
1421 | 945 | *kbit = 0; |
1422 | | |
1423 | 945 | i__1 = *lx; |
1424 | 56.7k | for (k = 1; k <= i__1; ++k) { |
1425 | 61.4k | L410: |
1426 | 61.4k | if (nov[k] < ibxx2[*kbit]) { |
1427 | 55.7k | goto L420; |
1428 | 55.7k | } |
1429 | 5.67k | ++(*kbit); |
1430 | 5.67k | goto L410; |
1431 | 55.7k | L420: |
1432 | 55.7k | ; |
1433 | 55.7k | } |
1434 | | |
1435 | | /* DETERMINE WHETHER THE GROUP SIZES SHOULD BE REDUCED */ |
1436 | | /* FOR SPACE EFFICIENCY. */ |
1437 | | |
1438 | 945 | if (ired == 0) { |
1439 | 945 | reduce(kfildo, &jmin[1], &jmax[1], &lbit[1], &nov[1], lx, ndg, ibit, |
1440 | 945 | jbit, kbit, novref, ibxx2, ier); |
1441 | | |
1442 | 945 | if (*ier == 714 || *ier == 715) { |
1443 | | /* REDUCE HAS ABORTED. REEXECUTE PACK_GP WITHOUT REDUCE. */ |
1444 | | /* PROVIDE FOR A NON FATAL RETURN FROM REDUCE. */ |
1445 | 0 | iersav = *ier; |
1446 | 0 | ired = 1; |
1447 | 0 | *ier = 0; |
1448 | 0 | goto L102; |
1449 | 0 | } |
1450 | | |
1451 | 945 | } |
1452 | | |
1453 | 945 | free(misslx); |
1454 | 945 | misslx=0; |
1455 | | |
1456 | | /* CALL TIMPR(KFILDO,KFILDO,'END PACK_GP ') */ |
1457 | 945 | if (iersav != 0) { |
1458 | 0 | *ier = iersav; |
1459 | 0 | return 0; |
1460 | 0 | } |
1461 | | |
1462 | | /* 900 IF(IER.NE.0)RETURN1 */ |
1463 | | |
1464 | 946 | L900: |
1465 | 946 | free(misslx); |
1466 | 946 | return 0; |
1467 | 945 | } /* pack_gp__ */ |
1468 | | |