Coverage Report

Created: 2025-11-15 08:43

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/gdal/frmts/grib/degrib/g2clib/reduce.c
Line
Count
Source
1
/* reduce.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 <stdlib.h>
15
#include "grib2.h"
16
17
#include "cpl_port.h"
18
19
/* Subroutine */ int reduce(CPL_UNUSED integer *kfildo, integer *jmin, integer *jmax,
20
  integer *lbit, integer *nov, integer *lx, integer *ndg, integer *ibit,
21
   integer *jbit, integer *kbit, integer *novref, integer *ibxx2,
22
  integer *ier)
23
7
{
24
    /* Initialized data */
25
26
7
    static const integer ifeed = 12;
27
28
    /* System generated locals */
29
7
    integer i__1, i__2;
30
31
    /* Local variables */
32
7
    integer newboxtp = 0, j, l, m = 0, jj = 0, lxn = 0, left = 0;
33
7
    real pimp = 0;
34
7
    integer move = 0, novl = 0;
35
7
    char cfeed[1];
36
7
    integer /* nboxj[31], */ lxnkp = 0, iorigb = 0, ibxx2m1 = 0, movmin = 0,
37
7
        ntotbt[31], ntotpr = 0, newboxt = 0;
38
7
    integer *newbox, *newboxp;
39
40
41
/*        NOVEMBER 2001   GLAHN   TDL   GRIB2 */
42
/*        MARCH    2002   GLAHN   COMMENT IER = 715 */
43
/*        MARCH    2002   GLAHN   MODIFIED TO ACCOMMODATE LX=1 ON ENTRY */
44
45
/*        PURPOSE */
46
/*            DETERMINES WHETHER THE NUMBER OF GROUPS SHOULD BE */
47
/*            INCREASED IN ORDER TO REDUCE THE SIZE OF THE LARGE */
48
/*            GROUPS, AND TO MAKE THAT ADJUSTMENT.  BY REDUCING THE */
49
/*            SIZE OF THE LARGE GROUPS, LESS BITS MAY BE NECESSARY */
50
/*            FOR PACKING THE GROUP SIZES AND ALL THE INFORMATION */
51
/*            ABOUT THE GROUPS. */
52
53
/*            THE REFERENCE FOR NOV( ) WAS REMOVED IN THE CALLING */
54
/*            ROUTINE SO THAT KBIT COULD BE DETERMINED.  THIS */
55
/*            FURNISHES A STARTING POINT FOR THE ITERATIONS IN REDUCE. */
56
/*            HOWEVER, THE REFERENCE MUST BE CONSIDERED. */
57
58
/*        DATA SET USE */
59
/*           KFILDO - UNIT NUMBER FOR OUTPUT (PRINT) FILE. (OUTPUT) */
60
61
/*        VARIABLES IN CALL SEQUENCE */
62
/*              KFILDO = UNIT NUMBER FOR OUTPUT (PRINT) FILE.  (INPUT) */
63
/*             JMIN(J) = THE MINIMUM OF EACH GROUP (J=1,LX).  IT IS */
64
/*                       POSSIBLE AFTER SPLITTING THE GROUPS, JMIN( ) */
65
/*                       WILL NOT BE THE MINIMUM OF THE NEW GROUP. */
66
/*                       THIS DOESN'T MATTER; JMIN( ) IS REALLY THE */
67
/*                       GROUP REFERENCE AND DOESN'T HAVE TO BE THE */
68
/*                       SMALLEST VALUE.  (INPUT/OUTPUT) */
69
/*             JMAX(J) = THE MAXIMUM OF EACH GROUP (J=1,LX). */
70
/*                       (INPUT/OUTPUT) */
71
/*             LBIT(J) = THE NUMBER OF BITS NECESSARY TO PACK EACH GROUP */
72
/*                       (J=1,LX).  (INPUT/OUTPUT) */
73
/*              NOV(J) = THE NUMBER OF VALUES IN EACH GROUP (J=1,LX). */
74
/*                       (INPUT/OUTPUT) */
75
/*                  LX = THE NUMBER OF GROUPS.  THIS WILL BE INCREASED */
76
/*                       IF GROUPS ARE SPLIT.  (INPUT/OUTPUT) */
77
/*                 NDG = THE DIMENSION OF JMIN( ), JMAX( ), LBIT( ), AND */
78
/*                       NOV( ).  (INPUT) */
79
/*                IBIT = THE NUMBER OF BITS NECESSARY TO PACK THE JMIN(J) */
80
/*                       VALUES, J=1,LX.  (INPUT) */
81
/*                JBIT = THE NUMBER OF BITS NECESSARY TO PACK THE LBIT(J) */
82
/*                       VALUES, J=1,LX.  (INPUT) */
83
/*                KBIT = THE NUMBER OF BITS NECESSARY TO PACK THE NOV(J) */
84
/*                       VALUES, J=1,LX.  IF THE GROUPS ARE SPLIT, KBIT */
85
/*                       IS REDUCED.  (INPUT/OUTPUT) */
86
/*              NOVREF = REFERENCE VALUE FOR NOV( ).  (INPUT) */
87
/*            IBXX2(J) = 2**J (J=0,30).  (INPUT) */
88
/*                 IER = ERROR RETURN.  (OUTPUT) */
89
/*                         0 = GOOD RETURN. */
90
/*                       714 = PROBLEM IN ALGORITHM.  REDUCE ABORTED. */
91
/*                       715 = NGP NOT LARGE ENOUGH.  REDUCE ABORTED. */
92
/*           NTOTBT(J) = THE TOTAL BITS USED FOR THE PACKING BITS J */
93
/*                       (J=1,30).  (INTERNAL) */
94
/*            NBOXJ(J) = NEW BOXES NEEDED FOR THE PACKING BITS J */
95
/*                       (J=1,30).  (INTERNAL) */
96
/*           NEWBOX(L) = NUMBER OF NEW BOXES (GROUPS) FOR EACH ORIGINAL */
97
/*                       GROUP (L=1,LX) FOR THE CURRENT J.  (AUTOMATIC) */
98
/*                       (INTERNAL) */
99
/*          NEWBOXP(L) = SAME AS NEWBOX( ) BUT FOR THE PREVIOUS J. */
100
/*                       THIS ELIMINATES RECOMPUTATION.  (AUTOMATIC) */
101
/*                       (INTERNAL) */
102
/*               CFEED = CONTAINS THE CHARACTER REPRESENTATION */
103
/*                       OF A PRINTER FORM FEED.  (CHARACTER) (INTERNAL) */
104
/*               IFEED = CONTAINS THE INTEGER VALUE OF A PRINTER */
105
/*                       FORM FEED.  (INTERNAL) */
106
/*              IORIGB = THE ORIGINAL NUMBER OF BITS NECESSARY */
107
/*                       FOR THE GROUP VALUES.  (INTERNAL) */
108
/*        1         2         3         4         5         6         7 X */
109
110
/*        NON SYSTEM SUBROUTINES CALLED */
111
/*           NONE */
112
113
114
7
    if( *kbit <= 1 || *kbit >= 32 )
115
0
    {
116
0
        *ier = 714;
117
0
        return 0;
118
0
    }
119
120
/*        NEWBOX( ) AND NEWBOXP( ) were AUTOMATIC ARRAYS. */
121
7
    newbox = (integer *)calloc(*ndg,sizeof(integer));
122
7
    newboxp = (integer *)calloc(*ndg,sizeof(integer));
123
124
    /* Parameter adjustments */
125
7
    --nov;
126
7
    --lbit;
127
7
    --jmax;
128
7
    --jmin;
129
130
    /* Function Body */
131
132
7
    *ier = 0;
133
7
    if (*lx == 1) {
134
0
  goto L410;
135
0
    }
136
/*        IF THERE IS ONLY ONE GROUP, RETURN. */
137
138
7
    *(unsigned char *)cfeed = (char) ifeed;
139
140
/*        INITIALIZE NUMBER OF NEW BOXES PER GROUP TO ZERO. */
141
142
7
    i__1 = *lx;
143
1.44k
    for (l = 1; l <= i__1; ++l) {
144
1.44k
  newbox[l - 1] = 0;
145
/* L110: */
146
1.44k
    }
147
148
/*        INITIALIZE NUMBER OF TOTAL NEW BOXES PER J TO ZERO. */
149
150
224
    for (j = 1; j <= 31; ++j) {
151
217
  ntotbt[j - 1] = 999999999;
152
  /* nboxj[j - 1] = 0; */
153
/* L112: */
154
217
    }
155
156
7
    iorigb = (*ibit + *jbit + *kbit) * *lx;
157
/*        IBIT = BITS TO PACK THE JMIN( ). */
158
/*        JBIT = BITS TO PACK THE LBIT( ). */
159
/*        KBIT = BITS TO PACK THE NOV( ). */
160
/*        LX = NUMBER OF GROUPS. */
161
7
    ntotbt[*kbit - 1] = iorigb;
162
/*           THIS IS THE VALUE OF TOTAL BITS FOR THE ORIGINAL LX */
163
/*           GROUPS, WHICH REQUIRES KBITS TO PACK THE GROUP */
164
/*           LENGTHS.  SETTING THIS HERE MAKES ONE LESS LOOPS */
165
/*           NECESSARY BELOW. */
166
167
/*        COMPUTE BITS NOW USED FOR THE PARAMETERS DEFINED. */
168
169
/*        DETERMINE OTHER POSSIBILITIES BY INCREASING LX AND DECREASING */
170
/*        NOV( ) WITH VALUES GREATER THAN THRESHOLDS.  ASSUME A GROUP IS */
171
/*        SPLIT INTO 2 OR MORE GROUPS SO THAT KBIT IS REDUCED WITHOUT */
172
/*        CHANGING IBIT OR JBIT. */
173
174
7
    jj = 0;
175
176
/* Computing MIN */
177
7
    i__1 = 30;
178
7
    i__2 = *kbit - 1;
179
    /*for (j = min(i__1,i__2); j >= 2; --j) {*/
180
25
    for (j = (i__1 < i__2) ? i__1 : i__2; j >= 2; --j) {
181
/*           VALUES GE KBIT WILL NOT REQUIRE SPLITS.  ONCE THE TOTAL */
182
/*           BITS START INCREASING WITH DECREASING J, STOP.  ALSO, THE */
183
/*           NUMBER OF BITS REQUIRED IS KNOWN FOR KBITS = NTOTBT(KBIT). */
184
185
25
  newboxt = 0;
186
187
25
  i__1 = *lx;
188
5.77k
  for (l = 1; l <= i__1; ++l) {
189
190
5.75k
      if (nov[l] < ibxx2[j]) {
191
5.51k
    newbox[l - 1] = 0;
192
/*                 NO SPLITS OR NEW BOXES. */
193
5.51k
    goto L190;
194
5.51k
      } else {
195
    // novl = nov[l];
196
197
233
    m = (nov[l] - 1) / (ibxx2[j] - 1) + 1;
198
/*                 M IS FOUND BY SOLVING THE EQUATION BELOW FOR M: */
199
/*                 (NOV(L)+M-1)/M LT IBXX2(J) */
200
/*                 M GT (NOV(L)-1)/(IBXX2(J)-1) */
201
/*                 SET M = (NOV(L)-1)/(IBXX2(J)-1)+1 */
202
233
L130:
203
233
    novl = (nov[l] + m - 1) / m;
204
/*                 THE +M-1 IS NECESSARY.  FOR INSTANCE, 15 WILL FIT */
205
/*                 INTO A BOX 4 BITS WIDE, BUT WON'T DIVIDE INTO */
206
/*                 TWO BOXES 3 BITS WIDE EACH. */
207
208
233
    if (novl < ibxx2[j]) {
209
233
        goto L185;
210
233
    } else {
211
0
        ++m;
212
/* ***                  WRITE(KFILDO,135)L,NOV(L),NOVL,M,J,IBXX2(J) */
213
/* *** 135              FORMAT(/' AT 135--L,NOV(L),NOVL,M,J,IBXX2(J)',6I10) */
214
0
        goto L130;
215
0
    }
216
217
/*                 THE ABOVE DO LOOP WILL NEVER COMPLETE. */
218
233
      }
219
220
233
L185:
221
233
      newbox[l - 1] = m - 1;
222
233
      newboxt = newboxt + m - 1;
223
5.75k
L190:
224
5.75k
      ;
225
5.75k
  }
226
227
  /* nboxj[j - 1] = newboxt; */
228
25
  ntotpr = ntotbt[j];
229
25
  ntotbt[j - 1] = (*ibit + *jbit) * (*lx + newboxt) + j * (*lx +
230
25
    newboxt);
231
232
25
  if (ntotbt[j - 1] >= ntotpr) {
233
7
      jj = j + 1;
234
/*              THE PLUS IS USED BECAUSE J DECREASES PER ITERATION. */
235
7
      goto L250;
236
18
  } else {
237
238
/*              SAVE THE TOTAL NEW BOXES AND NEWBOX( ) IN CASE THIS */
239
/*              IS THE J TO USE. */
240
241
18
      newboxtp = newboxt;
242
243
18
      i__1 = *lx;
244
4.32k
      for (l = 1; l <= i__1; ++l) {
245
4.31k
    newboxp[l - 1] = newbox[l - 1];
246
/* L195: */
247
4.31k
      }
248
249
/*           WRITE(KFILDO,197)NEWBOXT,IBXX2(J) */
250
/* 197        FORMAT(/' *****************************************' */
251
/*    1             /' THE NUMBER OF NEWBOXES PER GROUP OF THE TOTAL', */
252
/*    2              I10,' FOR GROUP MAXSIZE PLUS 1 ='I10 */
253
/*    3             /' *****************************************') */
254
/*           WRITE(KFILDO,198) (NEWBOX(L),L=1,LX) */
255
/* 198        FORMAT(/' '20I6/(' '20I6)) */
256
18
  }
257
258
/* 205     WRITE(KFILDO,209)KBIT,IORIGB */
259
/* 209     FORMAT(/' ORIGINAL BITS WITH KBIT OF',I5,' =',I10) */
260
/*        WRITE(KFILDO,210)(N,N=2,10),(IBXX2(N),N=2,10), */
261
/*    1                    (NTOTBT(N),N=2,10),(NBOXJ(N),N=2,10), */
262
/*    2                    (N,N=11,20),(IBXX2(N),N=11,20), */
263
/*    3                    (NTOTBT(N),N=11,20),(NBOXJ(N),N=11,20), */
264
/*    4                    (N,N=21,30),(IBXX2(N),N=11,20), */
265
/*    5                    (NTOTBT(N),N=21,30),(NBOXJ(N),N=21,30) */
266
/* 210     FORMAT(/' THE TOTAL BYTES FOR MAXIMUM GROUP LENGTHS BY ROW'// */
267
/*    1      '   J         = THE NUMBER OF BITS PER GROUP LENGTH'/ */
268
/*    2      '   IBXX2(J)  = THE MAXIMUM GROUP LENGTH PLUS 1 FOR THIS J'/ */
269
/*    3      '   NTOTBT(J) = THE TOTAL BITS FOR THIS J'/ */
270
/*    4      '   NBOXJ(J)  = THE NEW GROUPS FOR THIS J'/ */
271
/*    5      4(/10X,9I10)/4(/10I10)/4(/10I10)) */
272
273
/* L200: */
274
25
    }
275
276
7
L250:
277
7
    if( jj == 0 )
278
0
    {
279
0
        *ier = 714;
280
0
        goto L410;
281
0
    }
282
7
    pimp = (iorigb - ntotbt[jj - 1]) / (real) iorigb * 100.f;
283
/*     WRITE(KFILDO,252)PIMP,KBIT,JJ */
284
/* 252  FORMAT(/' PERCENT IMPROVEMENT =',F6.1, */
285
/*    1        ' BY DECREASING GROUP LENGTHS FROM',I4,' TO',I4,' BITS') */
286
7
    if (pimp >= 2.f) {
287
288
/*        WRITE(KFILDO,255)CFEED,NEWBOXTP,IBXX2(JJ) */
289
/* 255     FORMAT(A1,/' *****************************************' */
290
/*    1             /' THE NUMBER OF NEWBOXES PER GROUP OF THE TOTAL', */
291
/*    2             I10,' FOR GROUP MAXSIZE PLUS 1 ='I10 */
292
/*    2             /' *****************************************') */
293
/*        WRITE(KFILDO,256) (NEWBOXP(L),L=1,LX) */
294
/* 256     FORMAT(/' '20I6) */
295
296
/*           ADJUST GROUP LENGTHS FOR MAXIMUM LENGTH OF JJ BITS. */
297
/*           THE MIN PER GROUP AND THE NUMBER OF BITS REQUIRED */
298
/*           PER GROUP ARE NOT CHANGED.  THIS MAY MEAN THAT A */
299
/*           GROUP HAS A MIN (OR REFERENCE) THAT IS NOT ZERO. */
300
/*           THIS SHOULD NOT MATTER TO THE UNPACKER. */
301
302
6
  lxnkp = *lx + newboxtp;
303
/*           LXNKP = THE NEW NUMBER OF BOXES */
304
305
6
  if (lxnkp > *ndg) {
306
/*              DIMENSIONS NOT LARGE ENOUGH.  PROBABLY AN ERROR */
307
/*              OF SOME SORT.  ABORT. */
308
/*           WRITE(KFILDO,257)NDG,LXNPK */
309
/*        1         2         3         4         5         6         7 X */
310
/* 257        FORMAT(/' DIMENSIONS OF JMIN, ETC. IN REDUCE =',I8, */
311
/*    1              ' NOT LARGE ENOUGH FOR THE EXPANDED NUMBER OF', */
312
/*    2              ' GROUPS =',I8,'.  ABORT REDUCE.') */
313
0
      *ier = 715;
314
0
      goto L410;
315
/*              AN ABORT CAUSES THE CALLING PROGRAM TO REEXECUTE */
316
/*              WITHOUT CALLING REDUCE. */
317
0
  }
318
319
6
  lxn = lxnkp;
320
/*           LXN IS THE NUMBER OF THE BOX IN THE NEW SERIES BEING */
321
/*           FILLED.  IT DECREASES PER ITERATION. */
322
6
  ibxx2m1 = ibxx2[jj] - 1;
323
/*           IBXX2M1 IS THE MAXIMUM NUMBER OF VALUES PER GROUP. */
324
325
1.44k
  for (l = *lx; l >= 1; --l) {
326
327
/*              THE VALUES IS NOV( ) REPRESENT THOSE VALUES + NOVREF. */
328
/*              WHEN VALUES ARE MOVED TO ANOTHER BOX, EACH VALUE */
329
/*              MOVED TO A NEW BOX REPRESENTS THAT VALUE + NOVREF. */
330
/*              THIS HAS TO BE CONSIDERED IN MOVING VALUES. */
331
332
1.43k
      if (newboxp[l - 1] * (ibxx2m1 + *novref) + *novref > nov[l] + *
333
1.43k
        novref) {
334
/*                 IF THE ABOVE TEST IS MET, THEN MOVING IBXX2M1 VALUES */
335
/*                 FOR ALL NEW BOXES WILL LEAVE A NEGATIVE NUMBER FOR */
336
/*                 THE LAST BOX.  NOT A TOLERABLE SITUATION. */
337
3
    movmin = (nov[l] - newboxp[l - 1] * *novref) / newboxp[l - 1];
338
3
    left = nov[l];
339
/*                 LEFT = THE NUMBER OF VALUES TO MOVE FROM THE ORIGINAL */
340
/*                 BOX TO EACH NEW BOX EXCEPT THE LAST.  LEFT IS THE */
341
/*                 NUMBER LEFT TO MOVE. */
342
1.43k
      } else {
343
1.43k
    movmin = ibxx2m1;
344
/*                 MOVMIN VALUES CAN BE MOVED FOR EACH NEW BOX. */
345
1.43k
    left = nov[l];
346
/*                 LEFT IS THE NUMBER OF VALUES LEFT TO MOVE. */
347
1.43k
      }
348
349
1.43k
      if (newboxp[l - 1] > 0) {
350
27
    if ((movmin + *novref) * newboxp[l - 1] + *novref <= nov[l] +
351
27
      *novref && (movmin + *novref) * (newboxp[l - 1] + 1)
352
27
      >= nov[l] + *novref) {
353
27
        goto L288;
354
27
    } else {
355
/* ***D                 WRITE(KFILDO,287)L,MOVMIN,NOVREF,NEWBOXP(L),NOV(L) */
356
/* ***D287              FORMAT(/' AT 287 IN REDUCE--L,MOVMIN,NOVREF,', */
357
/* ***D    1                    'NEWBOXP(L),NOV(L)',5I12 */
358
/* ***D    2                    ' REDUCE ABORTED.') */
359
/*              WRITE(KFILDO,2870) */
360
/* 2870          FORMAT(/' AN ERROR IN REDUCE ALGORITHM.  ABORT REDUCE.') */
361
0
        *ier = 714;
362
0
        goto L410;
363
/*                 AN ABORT CAUSES THE CALLING PROGRAM TO REEXECUTE */
364
/*                 WITHOUT CALLING REDUCE. */
365
0
    }
366
367
27
      }
368
369
1.43k
L288:
370
1.43k
      i__1 = newboxp[l - 1] + 1;
371
2.94k
      for (j = 1; j <= i__1; ++j) {
372
    /*move = min(movmin,left);*/
373
1.50k
    move = (movmin < left) ? movmin : left;
374
1.50k
    jmin[lxn] = jmin[l];
375
1.50k
    jmax[lxn] = jmax[l];
376
1.50k
    lbit[lxn] = lbit[l];
377
1.50k
    nov[lxn] = move;
378
1.50k
    --lxn;
379
1.50k
    left -= move + *novref;
380
/*                 THE MOVE OF MOVE VALUES REALLY REPRESENTS A MOVE OF */
381
/*                 MOVE + NOVREF VALUES. */
382
/* L290: */
383
1.50k
      }
384
385
1.43k
      if (left != -(*novref)) {
386
/* ***               WRITE(KFILDO,292)L,LXN,MOVE,LXNKP,IBXX2(JJ),LEFT,NOV(L), */
387
/* ***     1                          MOVMIN */
388
/* *** 292           FORMAT(' AT 292 IN REDUCE--L,LXN,MOVE,LXNKP,', */
389
/* ***     1                'IBXX2(JJ),LEFT,NOV(L),MOVMIN'/8I12) */
390
0
      }
391
392
/* L300: */
393
1.43k
  }
394
395
6
  *lx = lxnkp;
396
/*           LX IS NOW THE NEW NUMBER OF GROUPS. */
397
6
  *kbit = jj;
398
/*           KBIT IS NOW THE NEW NUMBER OF BITS REQUIRED FOR PACKING */
399
/*           GROUP LENGTHS. */
400
6
    }
401
402
/*     WRITE(KFILDO,406)CFEED,LX */
403
/* 406  FORMAT(A1,/' *****************************************' */
404
/*    1          /' THE GROUP SIZES NOV( ) AFTER REDUCTION IN SIZE', */
405
/*    2           ' FOR'I10,' GROUPS', */
406
/*    3          /' *****************************************') */
407
/*     WRITE(KFILDO,407) (NOV(J),J=1,LX) */
408
/* 407  FORMAT(/' '20I6) */
409
/*     WRITE(KFILDO,408)CFEED,LX */
410
/* 408  FORMAT(A1,/' *****************************************' */
411
/*    1          /' THE GROUP MINIMA JMIN( ) AFTER REDUCTION IN SIZE', */
412
/*    2           ' FOR'I10,' GROUPS', */
413
/*    3          /' *****************************************') */
414
/*     WRITE(KFILDO,409) (JMIN(J),J=1,LX) */
415
/* 409  FORMAT(/' '20I6) */
416
417
7
L410:
418
7
    if ( newbox != 0 ) free(newbox);
419
7
    if ( newboxp != 0 ) free(newboxp);
420
7
    return 0;
421
7
} /* reduce_ */