/* pack_gp.f -- translated by f2c (version 20031025). You must link the resulting object file with libf2c: on Microsoft Windows system, link with libf2c.lib; on Linux or Unix systems, link with .../path/to/libf2c.a -lm or, if you install libf2c.a in a standard place, with -lf2c -lm -- in that order, at the end of the command line, as in cc *.o -lf2c -lm Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., http://www.netlib.org/f2c/libf2c.zip */ /*#include "f2c.h"*/ #include #include "grib2.h" typedef g2int integer; typedef g2int logical; #define TRUE_ (1) #define FALSE_ (0) /* Subroutine */ int pack_gp(integer *kfildo, integer *ic, integer *nxy, integer *is523, integer *minpk, integer *inc, integer *missp, integer *misss, integer *jmin, integer *jmax, integer *lbit, integer *nov, integer *ndg, integer *lx, integer *ibit, integer *jbit, integer * kbit, integer *novref, integer *lbitref, integer *ier) { /* Initialized data */ const integer mallow = 1073741825; /* MALLOW=2**30+1 */ static integer ifeed = 12; static integer ifirst = 0; /* System generated locals */ integer i__1, i__2, i__3; /* Local variables */ static integer j, k, l; static logical adda; static integer ired, kinc, mina, maxa, minb, maxb, minc, maxc, ibxx2[31]; static char cfeed[1]; static integer nenda, nendb, ibita, ibitb, minak, minbk, maxak, maxbk, minck, maxck, nouta, lmiss, itest, nount; extern /* Subroutine */ int reduce(integer *, integer *, integer *, integer *, integer *, integer *, integer *, integer *, integer *, integer *, integer *, integer *, integer *); static integer ibitbs, mislla, misllb, misllc, iersav, lminpk, ktotal, kounta, kountb, kstart, mstart, mintst, maxtst, kounts, mintstk, maxtstk; integer *misslx; /* FEBRUARY 1994 GLAHN TDL MOS-2000 */ /* JUNE 1995 GLAHN MODIFIED FOR LMISS ERROR. */ /* JULY 1996 GLAHN ADDED MISSS */ /* FEBRUARY 1997 GLAHN REMOVED 4 REDUNDANT TESTS FOR */ /* MISSP.EQ.0; INSERTED A TEST TO BETTER */ /* HANDLE A STRING OF 9999'S */ /* FEBRUARY 1997 GLAHN ADDED LOOPS TO ELIMINATE TEST FOR */ /* MISSS WHEN MISSS = 0 */ /* MARCH 1997 GLAHN CORRECTED FOR SECONDARY MISSING VALUE */ /* MARCH 1997 GLAHN CORRECTED FOR USE OF LOCAL VALUE */ /* OF MINPK */ /* MARCH 1997 GLAHN CORRECTED FOR SECONDARY MISSING VALUE */ /* MARCH 1997 GLAHN CHANGED CALCULATING NUMBER OF BITS */ /* THROUGH EXPONENTS TO AN ARRAY (IMPROVED */ /* OVERALL PACKING PERFORMANCE BY ABOUT */ /* 35 PERCENT!). ALLOWED 0 BITS FOR */ /* PACKING JMIN( ), LBIT( ), AND NOV( ). */ /* MAY 1997 GLAHN A NUMBER OF CHANGES FOR EFFICIENCY. */ /* MOD FUNCTIONS ELIMINATED AND ONE */ /* IFTHEN ADDED. JOUNT REMOVED. */ /* RECOMPUTATION OF BITS NOT MADE UNLESS */ /* NECESSARY AFTER MOVING POINTS FROM */ /* ONE GROUP TO ANOTHER. NENDB ADJUSTED */ /* TO ELIMINATE POSSIBILITY OF VERY */ /* SMALL GROUP AT THE END. */ /* ABOUT 8 PERCENT IMPROVEMENT IN */ /* OVERALL PACKING. ISKIPA REMOVED; */ /* THERE IS ALWAYS A GROUP B THAT CAN */ /* BECOME GROUP A. CONTROL ON SIZE */ /* OF GROUP B (STATEMENT BELOW 150) */ /* ADDED. ADDED ADDA, AND USE */ /* OF GE AND LE INSTEAD OF GT AND LT */ /* IN LOOPS BETWEEN 150 AND 160. */ /* IBITBS ADDED TO SHORTEN TRIPS */ /* THROUGH LOOP. */ /* MARCH 2000 GLAHN MODIFIED FOR GRIB2; CHANGED NAME FROM */ /* PACKGP */ /* JANUARY 2001 GLAHN COMMENTS; IER = 706 SUBSTITUTED FOR */ /* STOPS; ADDED RETURN1; REMOVED STATEMENT */ /* NUMBER 110; ADDED IER AND * RETURN */ /* NOVEMBER 2001 GLAHN CHANGED SOME DIAGNOSTIC FORMATS TO */ /* ALLOW PRINTING LARGER NUMBERS */ /* NOVEMBER 2001 GLAHN ADDED MISSLX( ) TO PUT MAXIMUM VALUE */ /* INTO JMIN( ) WHEN ALL VALUES MISSING */ /* TO AGREE WITH GRIB STANDARD. */ /* NOVEMBER 2001 GLAHN CHANGED TWO TESTS ON MISSP AND MISSS */ /* EQ 0 TO TESTS ON IS523. HOWEVER, */ /* MISSP AND MISSS CANNOT IN GENERAL BE */ /* = 0. */ /* NOVEMBER 2001 GLAHN ADDED CALL TO REDUCE; DEFINED ITEST */ /* BEFORE LOOPS TO REDUCE COMPUTATION; */ /* STARTED LARGE GROUP WHEN ALL SAME */ /* VALUE */ /* DECEMBER 2001 GLAHN MODIFIED AND ADDED A FEW COMMENTS */ /* JANUARY 2002 GLAHN REMOVED LOOP BEFORE 150 TO DETERMINE */ /* A GROUP OF ALL SAME VALUE */ /* JANUARY 2002 GLAHN CHANGED MALLOW FROM 9999999 TO 2**30+1, */ /* AND MADE IT A PARAMETER */ /* MARCH 2002 GLAHN ADDED NON FATAL IER = 716, 717; */ /* REMOVED NENDB=NXY ABOVE 150; */ /* ADDED IERSAV=0; COMMENTS */ /* PURPOSE */ /* DETERMINES GROUPS OF VARIABLE SIZE, BUT AT LEAST OF */ /* SIZE MINPK, THE ASSOCIATED MAX (JMAX( )) AND MIN (JMIN( )), */ /* THE NUMBER OF BITS NECESSARY TO HOLD THE VALUES IN EACH */ /* GROUP (LBIT( )), THE NUMBER OF VALUES IN EACH GROUP */ /* (NOV( )), THE NUMBER OF BITS NECESSARY TO PACK THE JMIN( ) */ /* VALUES (IBIT), THE NUMBER OF BITS NECESSARY TO PACK THE */ /* LBIT( ) VALUES (JBIT), AND THE NUMBER OF BITS NECESSARY */ /* TO PACK THE NOV( ) VALUES (KBIT). THE ROUTINE IS DESIGNED */ /* TO DETERMINE THE GROUPS SUCH THAT A SMALL NUMBER OF BITS */ /* IS NECESSARY TO PACK THE DATA WITHOUT EXCESSIVE */ /* COMPUTATIONS. IF ALL VALUES IN THE GROUP ARE ZERO, THE */ /* NUMBER OF BITS TO USE IN PACKING IS DEFINED AS ZERO WHEN */ /* THERE CAN BE NO MISSING VALUES; WHEN THERE CAN BE MISSING */ /* VALUES, THE NUMBER OF BITS MUST BE AT LEAST 1 TO HAVE */ /* THE CAPABILITY TO RECOGNIZE THE MISSING VALUE. HOWEVER, */ /* IF ALL VALUES IN A GROUP ARE MISSING, THE NUMBER OF BITS */ /* NEEDED IS 0, AND THE UNPACKER RECOGNIZES THIS. */ /* ALL VARIABLES ARE INTEGER. EVEN THOUGH THE GROUPS ARE */ /* INITIALLY OF SIZE MINPK OR LARGER, AN ADJUSTMENT BETWEEN */ /* TWO GROUPS (THE LOOKBACK PROCEDURE) MAY MAKE A GROUP */ /* SMALLER THAN MINPK. THE CONTROL ON GROUP SIZE IS THAT */ /* THE SUM OF THE SIZES OF THE TWO CONSECUTIVE GROUPS, EACH OF */ /* SIZE MINPK OR LARGER, IS NOT DECREASED. WHEN DETERMINING */ /* THE NUMBER OF BITS NECESSARY FOR PACKING, THE LARGEST */ /* VALUE THAT CAN BE ACCOMMODATED IN, SAY, MBITS, IS */ /* 2**MBITS-1; THIS LARGEST VALUE (AND THE NEXT SMALLEST */ /* VALUE) IS RESERVED FOR THE MISSING VALUE INDICATOR (ONLY) */ /* WHEN IS523 NE 0. IF THE DIMENSION NDG */ /* IS NOT LARGE ENOUGH TO HOLD ALL THE GROUPS, THE LOCAL VALUE */ /* OF MINPK IS INCREASED BY 50 PERCENT. THIS IS REPEATED */ /* UNTIL NDG WILL SUFFICE. A DIAGNOSTIC IS PRINTED WHENEVER */ /* THIS HAPPENS, WHICH SHOULD BE VERY RARELY. IF IT HAPPENS */ /* OFTEN, NDG IN SUBROUTINE PACK SHOULD BE INCREASED AND */ /* A CORRESPONDING INCREASE IN SUBROUTINE UNPACK MADE. */ /* CONSIDERABLE CODE IS PROVIDED SO THAT NO MORE CHECKING */ /* FOR MISSING VALUES WITHIN LOOPS IS DONE THAN NECESSARY; */ /* THE ADDED EFFICIENCY OF THIS IS RELATIVELY MINOR, */ /* BUT DOES NO HARM. FOR GRIB2, THE REFERENCE VALUE FOR */ /* THE LENGTH OF GROUPS IN NOV( ) AND FOR THE NUMBER OF */ /* BITS NECESSARY TO PACK GROUP VALUES ARE DETERMINED, */ /* AND SUBTRACTED BEFORE JBIT AND KBIT ARE DETERMINED. */ /* WHEN 1 OR MORE GROUPS ARE LARGE COMPARED TO THE OTHERS, */ /* THE WIDTH OF ALL GROUPS MUST BE AS LARGE AS THE LARGEST. */ /* A SUBROUTINE REDUCE BREAKS UP LARGE GROUPS INTO 2 OR */ /* MORE TO REDUCE TOTAL BITS REQUIRED. IF REDUCE SHOULD */ /* ABORT, PACK_GP WILL BE EXECUTED AGAIN WITHOUT THE CALL */ /* TO REDUCE. */ /* DATA SET USE */ /* KFILDO - UNIT NUMBER FOR OUTPUT (PRINT) FILE. (OUTPUT) */ /* VARIABLES IN CALL SEQUENCE */ /* KFILDO = UNIT NUMBER FOR OUTPUT (PRINT) FILE. (INPUT) */ /* IC( ) = ARRAY TO HOLD DATA FOR PACKING. THE VALUES */ /* DO NOT HAVE TO BE POSITIVE AT THIS POINT, BUT */ /* MUST BE IN THE RANGE -2**30 TO +2**30 (THE */ /* THE VALUE OF MALLOW). THESE INTEGER VALUES */ /* WILL BE RETAINED EXACTLY THROUGH PACKING AND */ /* UNPACKING. (INPUT) */ /* NXY = NUMBER OF VALUES IN IC( ). ALSO TREATED */ /* AS ITS DIMENSION. (INPUT) */ /* IS523 = missing value management */ /* 0=data contains no missing values */ /* 1=data contains Primary missing values */ /* 2=data contains Primary and secondary missing values */ /* (INPUT) */ /* MINPK = THE MINIMUM SIZE OF EACH GROUP, EXCEPT POSSIBLY */ /* THE LAST ONE. (INPUT) */ /* INC = THE NUMBER OF VALUES TO ADD TO AN ALREADY */ /* EXISTING GROUP IN DETERMINING WHETHER OR NOT */ /* TO START A NEW GROUP. IDEALLY, THIS WOULD BE */ /* 1, BUT EACH TIME INC VALUES ARE ATTEMPTED, THE */ /* MAX AND MIN OF THE NEXT MINPK VALUES MUST BE */ /* FOUND. THIS IS "A LOOP WITHIN A LOOP," AND */ /* A SLIGHTLY LARGER VALUE MAY GIVE ABOUT AS GOOD */ /* RESULTS WITH SLIGHTLY LESS COMPUTATIONAL TIME. */ /* IF INC IS LE 0, 1 IS USED, AND A DIAGNOSTIC IS */ /* OUTPUT. NOTE: IT IS EXPECTED THAT INC WILL */ /* EQUAL 1. THE CODE USES INC PRIMARILY IN THE */ /* LOOPS STARTING AT STATEMENT 180. IF INC */ /* WERE 1, THERE WOULD NOT NEED TO BE LOOPS */ /* AS SUCH. HOWEVER, KINC (THE LOCAL VALUE OF */ /* INC) IS SET GE 1 WHEN NEAR THE END OF THE DATA */ /* TO FORESTALL A VERY SMALL GROUP AT THE END. */ /* (INPUT) */ /* MISSP = WHEN MISSING POINTS CAN BE PRESENT IN THE DATA, */ /* THEY WILL HAVE THE VALUE MISSP OR MISSS. */ /* MISSP IS THE PRIMARY MISSING VALUE AND MISSS */ /* IS THE SECONDARY MISSING VALUE . THESE MUST */ /* NOT BE VALUES THAT WOULD OCCUR WITH SUBTRACTING */ /* THE MINIMUM (REFERENCE) VALUE OR SCALING. */ /* FOR EXAMPLE, MISSP = 0 WOULD NOT BE ADVISABLE. */ /* (INPUT) */ /* MISSS = SECONDARY MISSING VALUE INDICATOR (SEE MISSP). */ /* (INPUT) */ /* JMIN(J) = THE MINIMUM OF EACH GROUP (J=1,LX). (OUTPUT) */ /* JMAX(J) = THE MAXIMUM OF EACH GROUP (J=1,LX). THIS IS */ /* NOT REALLY NEEDED, BUT SINCE THE MAX OF EACH */ /* GROUP MUST BE FOUND, SAVING IT HERE IS CHEAP */ /* IN CASE THE USER WANTS IT. (OUTPUT) */ /* LBIT(J) = THE NUMBER OF BITS NECESSARY TO PACK EACH GROUP */ /* (J=1,LX). IT IS ASSUMED THE MINIMUM OF EACH */ /* GROUP WILL BE REMOVED BEFORE PACKING, AND THE */ /* VALUES TO PACK WILL, THEREFORE, ALL BE POSITIVE. */ /* HOWEVER, IC( ) DOES NOT NECESSARILY CONTAIN */ /* ALL POSITIVE VALUES. IF THE OVERALL MINIMUM */ /* HAS BEEN REMOVED (THE USUAL CASE), THEN IC( ) */ /* WILL CONTAIN ONLY POSITIVE VALUES. (OUTPUT) */ /* NOV(J) = THE NUMBER OF VALUES IN EACH GROUP (J=1,LX). */ /* (OUTPUT) */ /* NDG = THE DIMENSION OF JMIN( ), JMAX( ), LBIT( ), AND */ /* NOV( ). (INPUT) */ /* LX = THE NUMBER OF GROUPS DETERMINED. (OUTPUT) */ /* IBIT = THE NUMBER OF BITS NECESSARY TO PACK THE JMIN(J) */ /* VALUES, J=1,LX. (OUTPUT) */ /* JBIT = THE NUMBER OF BITS NECESSARY TO PACK THE LBIT(J) */ /* VALUES, J=1,LX. (OUTPUT) */ /* KBIT = THE NUMBER OF BITS NECESSARY TO PACK THE NOV(J) */ /* VALUES, J=1,LX. (OUTPUT) */ /* NOVREF = REFERENCE VALUE FOR NOV( ). (OUTPUT) */ /* LBITREF = REFERENCE VALUE FOR LBIT( ). (OUTPUT) */ /* IER = ERROR RETURN. */ /* 706 = VALUE WILL NOT PACK IN 30 BITS--FATAL */ /* 714 = ERROR IN REDUCE--NON-FATAL */ /* 715 = NGP NOT LARGE ENOUGH IN REDUCE--NON-FATAL */ /* 716 = MINPK INCEASED--NON-FATAL */ /* 717 = INC SET = 1--NON-FATAL */ /* (OUTPUT) */ /* * = ALTERNATE RETURN WHEN IER NE 0 AND FATAL ERROR. */ /* INTERNAL VARIABLES */ /* CFEED = CONTAINS THE CHARACTER REPRESENTATION */ /* OF A PRINTER FORM FEED. */ /* IFEED = CONTAINS THE INTEGER VALUE OF A PRINTER */ /* FORM FEED. */ /* KINC = WORKING COPY OF INC. MAY BE MODIFIED. */ /* MINA = MINIMUM VALUE IN GROUP A. */ /* MAXA = MAXIMUM VALUE IN GROUP A. */ /* NENDA = THE PLACE IN IC( ) WHERE GROUP A ENDS. */ /* KSTART = THE PLACE IN IC( ) WHERE GROUP A STARTS. */ /* IBITA = NUMBER OF BITS NEEDED TO HOLD VALUES IN GROUP A. */ /* MINB = MINIMUM VALUE IN GROUP B. */ /* MAXB = MAXIMUM VALUE IN GROUP B. */ /* NENDB = THE PLACE IN IC( ) WHERE GROUP B ENDS. */ /* IBITB = NUMBER OF BITS NEEDED TO HOLD VALUES IN GROUP B. */ /* MINC = MINIMUM VALUE IN GROUP C. */ /* MAXC = MAXIMUM VALUE IN GROUP C. */ /* KTOTAL = COUNT OF NUMBER OF VALUES IN IC( ) PROCESSED. */ /* NOUNT = NUMBER OF VALUES ADDED TO GROUP A. */ /* LMISS = 0 WHEN IS523 = 0. WHEN PACKING INTO A */ /* SPECIFIC NUMBER OF BITS, SAY MBITS, */ /* THE MAXIMUM VALUE THAT CAN BE HANDLED IS */ /* 2**MBITS-1. WHEN IS523 = 1, INDICATING */ /* PRIMARY MISSING VALUES, THIS MAXIMUM VALUE */ /* IS RESERVED TO HOLD THE PRIMARY MISSING VALUE */ /* INDICATOR AND LMISS = 1. WHEN IS523 = 2, */ /* THE VALUE JUST BELOW THE MAXIMUM (I.E., */ /* 2**MBITS-2) IS RESERVED TO HOLD THE SECONDARY */ /* MISSING VALUE INDICATOR AND LMISS = 2. */ /* LMINPK = LOCAL VALUE OF MINPK. THIS WILL BE ADJUSTED */ /* UPWARD WHENEVER NDG IS NOT LARGE ENOUGH TO HOLD */ /* ALL THE GROUPS. */ /* MALLOW = THE LARGEST ALLOWABLE VALUE FOR PACKING. */ /* MISLLA = SET TO 1 WHEN ALL VALUES IN GROUP A ARE MISSING. */ /* THIS IS USED TO DISTINGUISH BETWEEN A REAL */ /* MINIMUM WHEN ALL VALUES ARE NOT MISSING */ /* AND A MINIMUM THAT HAS BEEN SET TO ZERO WHEN */ /* ALL VALUES ARE MISSING. 0 OTHERWISE. */ /* NOTE THAT THIS DOES NOT DISTINGUISH BETWEEN */ /* PRIMARY AND SECONDARY MISSINGS WHEN SECONDARY */ /* MISSINGS ARE PRESENT. THIS MEANS THAT */ /* LBIT( ) WILL NOT BE ZERO WITH THE RESULTING */ /* COMPRESSION EFFICIENCY WHEN SECONDARY MISSINGS */ /* ARE PRESENT. ALSO NOTE THAT A CHECK HAS BEEN */ /* MADE EARLIER TO DETERMINE THAT SECONDARY */ /* MISSINGS ARE REALLY THERE. */ /* MISLLB = SET TO 1 WHEN ALL VALUES IN GROUP B ARE MISSING. */ /* THIS IS USED TO DISTINGUISH BETWEEN A REAL */ /* MINIMUM WHEN ALL VALUES ARE NOT MISSING */ /* AND A MINIMUM THAT HAS BEEN SET TO ZERO WHEN */ /* ALL VALUES ARE MISSING. 0 OTHERWISE. */ /* MISLLC = PERFORMS THE SAME FUNCTION FOR GROUP C THAT */ /* MISLLA AND MISLLB DO FOR GROUPS B AND C, */ /* RESPECTIVELY. */ /* IBXX2(J) = AN ARRAY THAT WHEN THIS ROUTINE IS FIRST ENTERED */ /* IS SET TO 2**J, J=0,30. IBXX2(30) = 2**30, WHICH */ /* IS THE LARGEST VALUE PACKABLE, BECAUSE 2**31 */ /* IS LARGER THAN THE INTEGER WORD SIZE. */ /* IFIRST = SET BY DATA STATEMENT TO 0. CHANGED TO 1 ON */ /* FIRST */ /* ENTRY WHEN IBXX2( ) IS FILLED. */ /* MINAK = KEEPS TRACK OF THE LOCATION IN IC( ) WHERE THE */ /* MINIMUM VALUE IN GROUP A IS LOCATED. */ /* MAXAK = DOES THE SAME AS MINAK, EXCEPT FOR THE MAXIMUM. */ /* MINBK = THE SAME AS MINAK FOR GROUP B. */ /* MAXBK = THE SAME AS MAXAK FOR GROUP B. */ /* MINCK = THE SAME AS MINAK FOR GROUP C. */ /* MAXCK = THE SAME AS MAXAK FOR GROUP C. */ /* ADDA = KEEPS TRACK WHETHER OR NOT AN ATTEMPT TO ADD */ /* POINTS TO GROUP A WAS MADE. IF SO, THEN ADDA */ /* KEEPS FROM TRYING TO PUT ONE BACK INTO B. */ /* (LOGICAL) */ /* IBITBS = KEEPS CURRENT VALUE IF IBITB SO THAT LOOP */ /* ENDING AT 166 DOESN'T HAVE TO START AT */ /* IBITB = 0 EVERY TIME. */ /* MISSLX(J) = MALLOW EXCEPT WHEN A GROUP IS ALL ONE VALUE (AND */ /* LBIT(J) = 0) AND THAT VALUE IS MISSING. IN */ /* THAT CASE, MISSLX(J) IS MISSP OR MISSS. THIS */ /* GETS INSERTED INTO JMIN(J) LATER AS THE */ /* MISSING INDICATOR; IT CAN'T BE PUT IN UNTIL */ /* THE END, BECAUSE JMIN( ) IS USED TO CALCULATE */ /* THE MAXIMUM NUMBER OF BITS (IBITS) NEEDED TO */ /* PACK JMIN( ). */ /* 1 2 3 4 5 6 7 X */ /* NON SYSTEM SUBROUTINES CALLED */ /* NONE */ /* MISSLX( ) was AN AUTOMATIC ARRAY. */ misslx = (integer *)calloc(*ndg,sizeof(integer)); /* Parameter adjustments */ --ic; --nov; --lbit; --jmax; --jmin; /* Function Body */ *ier = 0; iersav = 0; /* CALL TIMPR(KFILDO,KFILDO,'START PACK_GP ') */ *(unsigned char *)cfeed = (char) ifeed; ired = 0; /* IRED IS A FLAG. WHEN ZERO, REDUCE WILL BE CALLED. */ /* IF REDUCE ABORTS, IRED = 1 AND IS NOT CALLED. IN */ /* THIS CASE PACK_GP EXECUTES AGAIN EXCEPT FOR REDUCE. */ if (*inc <= 0) { iersav = 717; /* WRITE(KFILDO,101)INC */ /* 101 FORMAT(/' ****INC ='I8,' NOT CORRECT IN PACK_GP. 1 IS USED.') */ } /* THERE WILL BE A RESTART OF PACK_GP IF SUBROUTINE REDUCE */ /* ABORTS. THIS SHOULD NOT HAPPEN, BUT IF IT DOES, PACK_GP */ /* WILL COMPLETE WITHOUT SUBROUTINE REDUCE. A NON FATAL */ /* DIAGNOSTIC RETURN IS PROVIDED. */ L102: /*kinc = max(*inc,1);*/ kinc = (*inc > 1) ? *inc : 1; lminpk = *minpk; /* CALCULATE THE POWERS OF 2 THE FIRST TIME ENTERED. */ if (ifirst == 0) { ifirst = 1; ibxx2[0] = 1; for (j = 1; j <= 30; ++j) { ibxx2[j] = ibxx2[j - 1] << 1; /* L104: */ } } /* THERE WILL BE A RESTART AT 105 IS NDG IS NOT LARGE ENOUGH. */ /* A NON FATAL DIAGNOSTIC RETURN IS PROVIDED. */ L105: kstart = 1; ktotal = 0; *lx = 0; adda = FALSE_; lmiss = 0; if (*is523 == 1) { lmiss = 1; } if (*is523 == 2) { lmiss = 2; } /* ************************************* */ /* THIS SECTION COMPUTES STATISTICS FOR GROUP A. GROUP A IS */ /* A GROUP OF SIZE LMINPK. */ /* ************************************* */ ibita = 0; mina = mallow; maxa = -mallow; minak = mallow; maxak = -mallow; /* FIND THE MIN AND MAX OF GROUP A. THIS WILL INITIALLY BE OF */ /* SIZE LMINPK (IF THERE ARE STILL LMINPK VALUES IN IC( )), BUT */ /* WILL INCREASE IN SIZE IN INCREMENTS OF INC UNTIL A NEW */ /* GROUP IS STARTED. THE DEFINITION OF GROUP A IS DONE HERE */ /* ONLY ONCE (UPON INITIAL ENTRY), BECAUSE A GROUP B CAN ALWAYS */ /* BECOME A NEW GROUP A AFTER A IS PACKED, EXCEPT IF LMINPK */ /* HAS TO BE INCREASED BECAUSE NDG IS TOO SMALL. THEREFORE, */ /* THE SEPARATE LOOPS FOR MISSING AND NON-MISSING HERE BUYS */ /* ALMOST NOTHING. */ /* Computing MIN */ i__1 = kstart + lminpk - 1; /*nenda = min(i__1,*nxy);*/ nenda = (i__1 < *nxy) ? i__1 : *nxy; if (*nxy - nenda <= lminpk / 2) { nenda = *nxy; } /* ABOVE STATEMENT GUARANTEES THE LAST GROUP IS GT LMINPK/2 BY */ /* MAKING THE ACTUAL GROUP LARGER. IF A PROVISION LIKE THIS IS */ /* NOT INCLUDED, THERE WILL MANY TIMES BE A VERY SMALL GROUP */ /* AT THE END. USE SEPARATE LOOPS FOR MISSING AND NO MISSING */ /* VALUES FOR EFFICIENCY. */ /* DETERMINE WHETHER THERE IS A LONG STRING OF THE SAME VALUE */ /* UNLESS NENDA = NXY. THIS MAY ALLOW A LARGE GROUP A TO */ /* START WITH, AS WITH MISSING VALUES. SEPARATE LOOPS FOR */ /* MISSING OPTIONS. THIS SECTION IS ONLY EXECUTED ONCE, */ /* IN DETERMINING THE FIRST GROUP. IT HELPS FOR AN ARRAY */ /* OF MOSTLY MISSING VALUES OR OF ONE VALUE, SUCH AS */ /* RADAR OR PRECIP DATA. */ if (nenda != *nxy && ic[kstart] == ic[kstart + 1]) { /* NO NEED TO EXECUTE IF FIRST TWO VALUES ARE NOT EQUAL. */ if (*is523 == 0) { /* THIS LOOP IS FOR NO MISSING VALUES. */ i__1 = *nxy; for (k = kstart + 1; k <= i__1; ++k) { if (ic[k] != ic[kstart]) { /* Computing MAX */ i__2 = nenda, i__3 = k - 1; /*nenda = max(i__2,i__3);*/ nenda = (i__2 > i__3) ? i__2 : i__3; goto L114; } /* L111: */ } nenda = *nxy; /* FALL THROUGH THE LOOP MEANS ALL VALUES ARE THE SAME. */ } else if (*is523 == 1) { /* THIS LOOP IS FOR PRIMARY MISSING VALUES ONLY. */ i__1 = *nxy; for (k = kstart + 1; k <= i__1; ++k) { if (ic[k] != *missp) { if (ic[k] != ic[kstart]) { /* Computing MAX */ i__2 = nenda, i__3 = k - 1; /*nenda = max(i__2,i__3);*/ nenda = (i__2 > i__3) ? i__2 : i__3; goto L114; } } /* L112: */ } nenda = *nxy; /* FALL THROUGH THE LOOP MEANS ALL VALUES ARE THE SAME. */ } else { /* THIS LOOP IS FOR PRIMARY AND SECONDARY MISSING VALUES. */ i__1 = *nxy; for (k = kstart + 1; k <= i__1; ++k) { if (ic[k] != *missp && ic[k] != *misss) { if (ic[k] != ic[kstart]) { /* Computing MAX */ i__2 = nenda, i__3 = k - 1; /*nenda = max(i__2,i__3);*/ nenda = (i__2 > i__3) ? i__2 : i__3; goto L114; } } /* L113: */ } nenda = *nxy; /* FALL THROUGH THE LOOP MEANS ALL VALUES ARE THE SAME. */ } } L114: if (*is523 == 0) { i__1 = nenda; for (k = kstart; k <= i__1; ++k) { if (ic[k] < mina) { mina = ic[k]; minak = k; } if (ic[k] > maxa) { maxa = ic[k]; maxak = k; } /* L115: */ } } else if (*is523 == 1) { i__1 = nenda; for (k = kstart; k <= i__1; ++k) { if (ic[k] == *missp) { goto L117; } if (ic[k] < mina) { mina = ic[k]; minak = k; } if (ic[k] > maxa) { maxa = ic[k]; maxak = k; } L117: ; } } else { i__1 = nenda; for (k = kstart; k <= i__1; ++k) { if (ic[k] == *missp || ic[k] == *misss) { goto L120; } if (ic[k] < mina) { mina = ic[k]; minak = k; } if (ic[k] > maxa) { maxa = ic[k]; maxak = k; } L120: ; } } kounta = nenda - kstart + 1; /* INCREMENT KTOTAL AND FIND THE BITS NEEDED TO PACK THE A GROUP. */ ktotal += kounta; mislla = 0; if (mina != mallow) { goto L125; } /* ALL MISSING VALUES MUST BE ACCOMMODATED. */ mina = 0; maxa = 0; mislla = 1; ibitb = 0; if (*is523 != 2) { goto L130; } /* WHEN ALL VALUES ARE MISSING AND THERE ARE NO */ /* SECONDARY MISSING VALUES, IBITA = 0. */ /* OTHERWISE, IBITA MUST BE CALCULATED. */ L125: itest = maxa - mina + lmiss; for (ibita = 0; ibita <= 30; ++ibita) { if (itest < ibxx2[ibita]) { goto L130; } /* *** THIS TEST IS THE SAME AS: */ /* *** IF(MAXA-MINA.LT.IBXX2(IBITA)-LMISS)GO TO 130 */ /* L126: */ } /* WRITE(KFILDO,127)MAXA,MINA */ /* 127 FORMAT(' ****ERROR IN PACK_GP. VALUE WILL NOT PACK IN 30 BITS.', */ /* 1 ' MAXA ='I13,' MINA ='I13,'. ERROR AT 127.') */ *ier = 706; goto L900; L130: /* ***D WRITE(KFILDO,131)KOUNTA,KTOTAL,MINA,MAXA,IBITA,MISLLA */ /* ***D131 FORMAT(' AT 130, KOUNTA ='I8,' KTOTAL ='I8,' MINA ='I8, */ /* ***D 1 ' MAXA ='I8,' IBITA ='I3,' MISLLA ='I3) */ L133: if (ktotal >= *nxy) { goto L200; } /* ************************************* */ /* THIS SECTION COMPUTES STATISTICS FOR GROUP B. GROUP B IS A */ /* GROUP OF SIZE LMINPK IMMEDIATELY FOLLOWING GROUP A. */ /* ************************************* */ L140: minb = mallow; maxb = -mallow; minbk = mallow; maxbk = -mallow; ibitbs = 0; mstart = ktotal + 1; /* DETERMINE WHETHER THERE IS A LONG STRING OF THE SAME VALUE. */ /* THIS WORKS WHEN THERE ARE NO MISSING VALUES. */ nendb = 1; if (mstart < *nxy) { if (*is523 == 0) { /* THIS LOOP IS FOR NO MISSING VALUES. */ i__1 = *nxy; for (k = mstart + 1; k <= i__1; ++k) { if (ic[k] != ic[mstart]) { nendb = k - 1; goto L150; } /* L145: */ } nendb = *nxy; /* FALL THROUGH THE LOOP MEANS ALL REMAINING VALUES */ /* ARE THE SAME. */ } } L150: /* Computing MAX */ /* Computing MIN */ i__3 = ktotal + lminpk; /*i__1 = nendb, i__2 = min(i__3,*nxy);*/ i__1 = nendb, i__2 = (i__3 < *nxy) ? i__3 : *nxy; /*nendb = max(i__1,i__2);*/ nendb = (i__1 > i__2) ? i__1 : i__2; /* **** 150 NENDB=MIN(KTOTAL+LMINPK,NXY) */ if (*nxy - nendb <= lminpk / 2) { nendb = *nxy; } /* ABOVE STATEMENT GUARANTEES THE LAST GROUP IS GT LMINPK/2 BY */ /* MAKING THE ACTUAL GROUP LARGER. IF A PROVISION LIKE THIS IS */ /* NOT INCLUDED, THERE WILL MANY TIMES BE A VERY SMALL GROUP */ /* AT THE END. USE SEPARATE LOOPS FOR MISSING AND NO MISSING */ /* USE SEPARATE LOOPS FOR MISSING AND NO MISSING VALUES */ /* FOR EFFICIENCY. */ if (*is523 == 0) { i__1 = nendb; for (k = mstart; k <= i__1; ++k) { if (ic[k] <= minb) { minb = ic[k]; /* NOTE LE, NOT LT. LT COULD BE USED BUT THEN A */ /* RECOMPUTE OVER THE WHOLE GROUP WOULD BE NEEDED */ /* MORE OFTEN. SAME REASONING FOR GE AND OTHER */ /* LOOPS BELOW. */ minbk = k; } if (ic[k] >= maxb) { maxb = ic[k]; maxbk = k; } /* L155: */ } } else if (*is523 == 1) { i__1 = nendb; for (k = mstart; k <= i__1; ++k) { if (ic[k] == *missp) { goto L157; } if (ic[k] <= minb) { minb = ic[k]; minbk = k; } if (ic[k] >= maxb) { maxb = ic[k]; maxbk = k; } L157: ; } } else { i__1 = nendb; for (k = mstart; k <= i__1; ++k) { if (ic[k] == *missp || ic[k] == *misss) { goto L160; } if (ic[k] <= minb) { minb = ic[k]; minbk = k; } if (ic[k] >= maxb) { maxb = ic[k]; maxbk = k; } L160: ; } } kountb = nendb - ktotal; misllb = 0; if (minb != mallow) { goto L165; } /* ALL MISSING VALUES MUST BE ACCOMMODATED. */ minb = 0; maxb = 0; misllb = 1; ibitb = 0; if (*is523 != 2) { goto L170; } /* WHEN ALL VALUES ARE MISSING AND THERE ARE NO SECONDARY */ /* MISSING VALUES, IBITB = 0. OTHERWISE, IBITB MUST BE */ /* CALCULATED. */ L165: for (ibitb = ibitbs; ibitb <= 30; ++ibitb) { if (maxb - minb < ibxx2[ibitb] - lmiss) { goto L170; } /* L166: */ } /* WRITE(KFILDO,167)MAXB,MINB */ /* 167 FORMAT(' ****ERROR IN PACK_GP. VALUE WILL NOT PACK IN 30 BITS.', */ /* 1 ' MAXB ='I13,' MINB ='I13,'. ERROR AT 167.') */ *ier = 706; goto L900; /* COMPARE THE BITS NEEDED TO PACK GROUP B WITH THOSE NEEDED */ /* TO PACK GROUP A. IF IBITB GE IBITA, TRY TO ADD TO GROUP A. */ /* IF NOT, TRY TO ADD A'S POINTS TO B, UNLESS ADDITION TO A */ /* HAS BEEN DONE. THIS LATTER IS CONTROLLED WITH ADDA. */ L170: /* ***D WRITE(KFILDO,171)KOUNTA,KTOTAL,MINA,MAXA,IBITA,MISLLA, */ /* ***D 1 MINB,MAXB,IBITB,MISLLB */ /* ***D171 FORMAT(' AT 171, KOUNTA ='I8,' KTOTAL ='I8,' MINA ='I8, */ /* ***D 1 ' MAXA ='I8,' IBITA ='I3,' MISLLA ='I3, */ /* ***D 2 ' MINB ='I8,' MAXB ='I8,' IBITB ='I3,' MISLLB ='I3) */ if (ibitb >= ibita) { goto L180; } if (adda) { goto L200; } /* ************************************* */ /* GROUP B REQUIRES LESS BITS THAN GROUP A. PUT AS MANY OF A'S */ /* POINTS INTO B AS POSSIBLE WITHOUT EXCEEDING THE NUMBER OF */ /* BITS NECESSARY TO PACK GROUP B. */ /* ************************************* */ kounts = kounta; /* KOUNTA REFERS TO THE PRESENT GROUP A. */ mintst = minb; maxtst = maxb; mintstk = minbk; maxtstk = maxbk; /* USE SEPARATE LOOPS FOR MISSING AND NO MISSING VALUES */ /* FOR EFFICIENCY. */ if (*is523 == 0) { i__1 = kstart; for (k = ktotal; k >= i__1; --k) { /* START WITH THE END OF THE GROUP AND WORK BACKWARDS. */ if (ic[k] < minb) { mintst = ic[k]; mintstk = k; } else if (ic[k] > maxb) { maxtst = ic[k]; maxtstk = k; } if (maxtst - mintst >= ibxx2[ibitb]) { goto L174; } /* NOTE THAT FOR THIS LOOP, LMISS = 0. */ minb = mintst; maxb = maxtst; minbk = mintstk; maxbk = maxtstk; --kounta; /* THERE IS ONE LESS POINT NOW IN A. */ /* L1715: */ } } else if (*is523 == 1) { i__1 = kstart; for (k = ktotal; k >= i__1; --k) { /* START WITH THE END OF THE GROUP AND WORK BACKWARDS. */ if (ic[k] == *missp) { goto L1718; } if (ic[k] < minb) { mintst = ic[k]; mintstk = k; } else if (ic[k] > maxb) { maxtst = ic[k]; maxtstk = k; } if (maxtst - mintst >= ibxx2[ibitb] - lmiss) { goto L174; } /* FOR THIS LOOP, LMISS = 1. */ minb = mintst; maxb = maxtst; minbk = mintstk; maxbk = maxtstk; misllb = 0; /* WHEN THE POINT IS NON MISSING, MISLLB SET = 0. */ L1718: --kounta; /* THERE IS ONE LESS POINT NOW IN A. */ /* L1719: */ } } else { i__1 = kstart; for (k = ktotal; k >= i__1; --k) { /* START WITH THE END OF THE GROUP AND WORK BACKWARDS. */ if (ic[k] == *missp || ic[k] == *misss) { goto L1729; } if (ic[k] < minb) { mintst = ic[k]; mintstk = k; } else if (ic[k] > maxb) { maxtst = ic[k]; maxtstk = k; } if (maxtst - mintst >= ibxx2[ibitb] - lmiss) { goto L174; } /* FOR THIS LOOP, LMISS = 2. */ minb = mintst; maxb = maxtst; minbk = mintstk; maxbk = maxtstk; misllb = 0; /* WHEN THE POINT IS NON MISSING, MISLLB SET = 0. */ L1729: --kounta; /* THERE IS ONE LESS POINT NOW IN A. */ /* L173: */ } } /* AT THIS POINT, KOUNTA CONTAINS THE NUMBER OF POINTS TO CLOSE */ /* OUT GROUP A WITH. GROUP B NOW STARTS WITH KSTART+KOUNTA AND */ /* ENDS WITH NENDB. MINB AND MAXB HAVE BEEN ADJUSTED AS */ /* NECESSARY TO REFLECT GROUP B (EVEN THOUGH THE NUMBER OF BITS */ /* NEEDED TO PACK GROUP B HAVE NOT INCREASED, THE END POINTS */ /* OF THE RANGE MAY HAVE). */ L174: if (kounta == kounts) { goto L200; } /* ON TRANSFER, GROUP A WAS NOT CHANGED. CLOSE IT OUT. */ /* ONE OR MORE POINTS WERE TAKEN OUT OF A. RANGE AND IBITA */ /* MAY HAVE TO BE RECOMPUTED; IBITA COULD BE LESS THAN */ /* ORIGINALLY COMPUTED. IN FACT, GROUP A CAN NOW CONTAIN */ /* ONLY ONE POINT AND BE PACKED WITH ZERO BITS */ /* (UNLESS MISSS NE 0). */ nouta = kounts - kounta; ktotal -= nouta; kountb += nouta; if (nenda - nouta > minak && nenda - nouta > maxak) { goto L200; } /* WHEN THE ABOVE TEST IS MET, THE MIN AND MAX OF THE */ /* CURRENT GROUP A WERE WITHIN THE OLD GROUP A, SO THE */ /* RANGE AND IBITA DO NOT NEED TO BE RECOMPUTED. */ /* NOTE THAT MINAK AND MAXAK ARE NO LONGER NEEDED. */ ibita = 0; mina = mallow; maxa = -mallow; /* USE SEPARATE LOOPS FOR MISSING AND NO MISSING VALUES */ /* FOR EFFICIENCY. */ if (*is523 == 0) { i__1 = nenda - nouta; for (k = kstart; k <= i__1; ++k) { if (ic[k] < mina) { mina = ic[k]; } if (ic[k] > maxa) { maxa = ic[k]; } /* L1742: */ } } else if (*is523 == 1) { i__1 = nenda - nouta; for (k = kstart; k <= i__1; ++k) { if (ic[k] == *missp) { goto L1744; } if (ic[k] < mina) { mina = ic[k]; } if (ic[k] > maxa) { maxa = ic[k]; } L1744: ; } } else { i__1 = nenda - nouta; for (k = kstart; k <= i__1; ++k) { if (ic[k] == *missp || ic[k] == *misss) { goto L175; } if (ic[k] < mina) { mina = ic[k]; } if (ic[k] > maxa) { maxa = ic[k]; } L175: ; } } mislla = 0; if (mina != mallow) { goto L1750; } /* ALL MISSING VALUES MUST BE ACCOMMODATED. */ mina = 0; maxa = 0; mislla = 1; if (*is523 != 2) { goto L177; } /* WHEN ALL VALUES ARE MISSING AND THERE ARE NO SECONDARY */ /* MISSING VALUES IBITA = 0 AS ORIGINALLY SET. OTHERWISE, */ /* IBITA MUST BE CALCULATED. */ L1750: itest = maxa - mina + lmiss; for (ibita = 0; ibita <= 30; ++ibita) { if (itest < ibxx2[ibita]) { goto L177; } /* *** THIS TEST IS THE SAME AS: */ /* *** IF(MAXA-MINA.LT.IBXX2(IBITA)-LMISS)GO TO 177 */ /* L176: */ } /* WRITE(KFILDO,1760)MAXA,MINA */ /* 1760 FORMAT(' ****ERROR IN PACK_GP. VALUE WILL NOT PACK IN 30 BITS.', */ /* 1 ' MAXA ='I13,' MINA ='I13,'. ERROR AT 1760.') */ *ier = 706; goto L900; L177: goto L200; /* ************************************* */ /* AT THIS POINT, GROUP B REQUIRES AS MANY BITS TO PACK AS GROUPA. */ /* THEREFORE, TRY TO ADD INC POINTS TO GROUP A WITHOUT INCREASING */ /* IBITA. THIS AUGMENTED GROUP IS CALLED GROUP C. */ /* ************************************* */ L180: if (mislla == 1) { minc = mallow; minck = mallow; maxc = -mallow; maxck = -mallow; } else { minc = mina; maxc = maxa; minck = minak; maxck = minak; } nount = 0; if (*nxy - (ktotal + kinc) <= lminpk / 2) { kinc = *nxy - ktotal; } /* ABOVE STATEMENT CONSTRAINS THE LAST GROUP TO BE NOT LESS THAN */ /* LMINPK/2 IN SIZE. IF A PROVISION LIKE THIS IS NOT INCLUDED, */ /* THERE WILL MANY TIMES BE A VERY SMALL GROUP AT THE END. */ /* USE SEPARATE LOOPS FOR MISSING AND NO MISSING VALUES */ /* FOR EFFICIENCY. SINCE KINC IS USUALLY 1, USING SEPARATE */ /* LOOPS HERE DOESN'T BUY MUCH. A MISSING VALUE WILL ALWAYS */ /* TRANSFER BACK TO GROUP A. */ if (*is523 == 0) { /* Computing MIN */ i__2 = ktotal + kinc; /*i__1 = min(i__2,*nxy);*/ i__1 = (i__2 < *nxy) ? i__2 : *nxy; for (k = ktotal + 1; k <= i__1; ++k) { if (ic[k] < minc) { minc = ic[k]; minck = k; } if (ic[k] > maxc) { maxc = ic[k]; maxck = k; } ++nount; /* L185: */ } } else if (*is523 == 1) { /* Computing MIN */ i__2 = ktotal + kinc; /*i__1 = min(i__2,*nxy);*/ i__1 = (i__2 < *nxy) ? i__2 : *nxy; for (k = ktotal + 1; k <= i__1; ++k) { if (ic[k] == *missp) { goto L186; } if (ic[k] < minc) { minc = ic[k]; minck = k; } if (ic[k] > maxc) { maxc = ic[k]; maxck = k; } L186: ++nount; /* L187: */ } } else { /* Computing MIN */ i__2 = ktotal + kinc; /*i__1 = min(i__2,*nxy);*/ i__1 = (i__2 < *nxy) ? i__2 : *nxy; for (k = ktotal + 1; k <= i__1; ++k) { if (ic[k] == *missp || ic[k] == *misss) { goto L189; } if (ic[k] < minc) { minc = ic[k]; minck = k; } if (ic[k] > maxc) { maxc = ic[k]; maxck = k; } L189: ++nount; /* L190: */ } } /* ***D WRITE(KFILDO,191)KOUNTA,KTOTAL,MINA,MAXA,IBITA,MISLLA, */ /* ***D 1 MINC,MAXC,NOUNT,IC(KTOTAL),IC(KTOTAL+1) */ /* ***D191 FORMAT(' AT 191, KOUNTA ='I8,' KTOTAL ='I8,' MINA ='I8, */ /* ***D 1 ' MAXA ='I8,' IBITA ='I3,' MISLLA ='I3, */ /* ***D 2 ' MINC ='I8,' MAXC ='I8, */ /* ***D 3 ' NOUNT ='I5,' IC(KTOTAL) ='I9,' IC(KTOTAL+1) =',I9) */ /* IF THE NUMBER OF BITS NEEDED FOR GROUP C IS GT IBITA, */ /* THEN THIS GROUP A IS A GROUP TO PACK. */ if (minc == mallow) { minc = mina; maxc = maxa; minck = minak; maxck = maxak; misllc = 1; goto L195; /* WHEN THE NEW VALUE(S) ARE MISSING, THEY CAN ALWAYS */ /* BE ADDED. */ } else { misllc = 0; } if (maxc - minc >= ibxx2[ibita] - lmiss) { goto L200; } /* THE BITS NECESSARY FOR GROUP C HAS NOT INCREASED FROM THE */ /* BITS NECESSARY FOR GROUP A. ADD THIS POINT(S) TO GROUP A. */ /* COMPUTE THE NEXT GROUP B, ETC., UNLESS ALL POINTS HAVE BEEN */ /* USED. */ L195: ktotal += nount; kounta += nount; mina = minc; maxa = maxc; minak = minck; maxak = maxck; mislla = misllc; adda = TRUE_; if (ktotal >= *nxy) { goto L200; } if (minbk > ktotal && maxbk > ktotal) { mstart = nendb + 1; /* THE MAX AND MIN OF GROUP B WERE NOT FROM THE POINTS */ /* REMOVED, SO THE WHOLE GROUP DOES NOT HAVE TO BE LOOKED */ /* AT TO DETERMINE THE NEW MAX AND MIN. RATHER START */ /* JUST BEYOND THE OLD NENDB. */ ibitbs = ibitb; nendb = 1; goto L150; } else { goto L140; } /* ************************************* */ /* GROUP A IS TO BE PACKED. STORE VALUES IN JMIN( ), JMAX( ), */ /* LBIT( ), AND NOV( ). */ /* ************************************* */ L200: ++(*lx); if (*lx <= *ndg) { goto L205; } lminpk += lminpk / 2; /* WRITE(KFILDO,201)NDG,LMINPK,LX */ /* 201 FORMAT(' ****NDG ='I5,' NOT LARGE ENOUGH.', */ /* 1 ' LMINPK IS INCREASED TO 'I3,' FOR THIS FIELD.'/ */ /* 2 ' LX = 'I10) */ iersav = 716; goto L105; L205: jmin[*lx] = mina; jmax[*lx] = maxa; lbit[*lx] = ibita; nov[*lx] = kounta; kstart = ktotal + 1; if (mislla == 0) { misslx[*lx - 1] = mallow; } else { misslx[*lx - 1] = ic[ktotal]; /* IC(KTOTAL) WAS THE LAST VALUE PROCESSED. IF MISLLA NE 0, */ /* THIS MUST BE THE MISSING VALUE FOR THIS GROUP. */ } /* ***D WRITE(KFILDO,206)MISLLA,IC(KTOTAL),KTOTAL,LX,JMIN(LX),JMAX(LX), */ /* ***D 1 LBIT(LX),NOV(LX),MISSLX(LX) */ /* ***D206 FORMAT(' AT 206, MISLLA ='I2,' IC(KTOTAL) ='I5,' KTOTAL ='I8, */ /* ***D 1 ' LX ='I6,' JMIN(LX) ='I8,' JMAX(LX) ='I8, */ /* ***D 2 ' LBIT(LX) ='I5,' NOV(LX) ='I8,' MISSLX(LX) =',I7) */ if (ktotal >= *nxy) { goto L209; } /* THE NEW GROUP A WILL BE THE PREVIOUS GROUP B. SET LIMITS, ETC. */ ibita = ibitb; mina = minb; maxa = maxb; minak = minbk; maxak = maxbk; mislla = misllb; nenda = nendb; kounta = kountb; ktotal += kounta; adda = FALSE_; goto L133; /* ************************************* */ /* CALCULATE IBIT, THE NUMBER OF BITS NEEDED TO HOLD THE GROUP */ /* MINIMUM VALUES. */ /* ************************************* */ L209: *ibit = 0; i__1 = *lx; for (l = 1; l <= i__1; ++l) { L210: if (jmin[l] < ibxx2[*ibit]) { goto L220; } ++(*ibit); goto L210; L220: ; } /* INSERT THE VALUE IN JMIN( ) TO BE USED FOR ALL MISSING */ /* VALUES WHEN LBIT( ) = 0. WHEN SECONDARY MISSING */ /* VALUES CAN BE PRESENT, LBIT(L) WILL NOT = 0. */ if (*is523 == 1) { i__1 = *lx; for (l = 1; l <= i__1; ++l) { if (lbit[l] == 0) { if (misslx[l - 1] == *missp) { jmin[l] = ibxx2[*ibit] - 1; } } /* L226: */ } } /* ************************************* */ /* CALCULATE JBIT, THE NUMBER OF BITS NEEDED TO HOLD THE BITS */ /* NEEDED TO PACK THE VALUES IN THE GROUPS. BUT FIND AND */ /* REMOVE THE REFERENCE VALUE FIRST. */ /* ************************************* */ /* WRITE(KFILDO,228)CFEED,LX */ /* 228 FORMAT(A1,/' *****************************************' */ /* 1 /' THE GROUP WIDTHS LBIT( ) FOR ',I8,' GROUPS' */ /* 2 /' *****************************************') */ /* WRITE(KFILDO,229) (LBIT(J),J=1,MIN(LX,100)) */ /* 229 FORMAT(/' '20I6) */ *lbitref = lbit[1]; i__1 = *lx; for (k = 1; k <= i__1; ++k) { if (lbit[k] < *lbitref) { *lbitref = lbit[k]; } /* L230: */ } if (*lbitref != 0) { i__1 = *lx; for (k = 1; k <= i__1; ++k) { lbit[k] -= *lbitref; /* L240: */ } } /* WRITE(KFILDO,241)CFEED,LBITREF */ /* 241 FORMAT(A1,/' *****************************************' */ /* 1 /' THE GROUP WIDTHS LBIT( ) AFTER REMOVING REFERENCE ', */ /* 2 I8, */ /* 3 /' *****************************************') */ /* WRITE(KFILDO,242) (LBIT(J),J=1,MIN(LX,100)) */ /* 242 FORMAT(/' '20I6) */ *jbit = 0; i__1 = *lx; for (k = 1; k <= i__1; ++k) { L310: if (lbit[k] < ibxx2[*jbit]) { goto L320; } ++(*jbit); goto L310; L320: ; } /* ************************************* */ /* CALCULATE KBIT, THE NUMBER OF BITS NEEDED TO HOLD THE NUMBER */ /* OF VALUES IN THE GROUPS. BUT FIND AND REMOVE THE */ /* REFERENCE FIRST. */ /* ************************************* */ /* WRITE(KFILDO,321)CFEED,LX */ /* 321 FORMAT(A1,/' *****************************************' */ /* 1 /' THE GROUP SIZES NOV( ) FOR ',I8,' GROUPS' */ /* 2 /' *****************************************') */ /* WRITE(KFILDO,322) (NOV(J),J=1,MIN(LX,100)) */ /* 322 FORMAT(/' '20I6) */ *novref = nov[1]; i__1 = *lx; for (k = 1; k <= i__1; ++k) { if (nov[k] < *novref) { *novref = nov[k]; } /* L400: */ } if (*novref > 0) { i__1 = *lx; for (k = 1; k <= i__1; ++k) { nov[k] -= *novref; /* L405: */ } } /* WRITE(KFILDO,406)CFEED,NOVREF */ /* 406 FORMAT(A1,/' *****************************************' */ /* 1 /' THE GROUP SIZES NOV( ) AFTER REMOVING REFERENCE ',I8, */ /* 2 /' *****************************************') */ /* WRITE(KFILDO,407) (NOV(J),J=1,MIN(LX,100)) */ /* 407 FORMAT(/' '20I6) */ /* WRITE(KFILDO,408)CFEED */ /* 408 FORMAT(A1,/' *****************************************' */ /* 1 /' THE GROUP REFERENCES JMIN( )' */ /* 2 /' *****************************************') */ /* WRITE(KFILDO,409) (JMIN(J),J=1,MIN(LX,100)) */ /* 409 FORMAT(/' '20I6) */ *kbit = 0; i__1 = *lx; for (k = 1; k <= i__1; ++k) { L410: if (nov[k] < ibxx2[*kbit]) { goto L420; } ++(*kbit); goto L410; L420: ; } /* DETERMINE WHETHER THE GROUP SIZES SHOULD BE REDUCED */ /* FOR SPACE EFFICIENCY. */ if (ired == 0) { reduce(kfildo, &jmin[1], &jmax[1], &lbit[1], &nov[1], lx, ndg, ibit, jbit, kbit, novref, ibxx2, ier); if (*ier == 714 || *ier == 715) { /* REDUCE HAS ABORTED. REEXECUTE PACK_GP WITHOUT REDUCE. */ /* PROVIDE FOR A NON FATAL RETURN FROM REDUCE. */ iersav = *ier; ired = 1; *ier = 0; goto L102; } } if ( misslx != 0 ) { free(misslx); misslx=0; } /* CALL TIMPR(KFILDO,KFILDO,'END PACK_GP ') */ if (iersav != 0) { *ier = iersav; return 0; } /* 900 IF(IER.NE.0)RETURN1 */ L900: if ( misslx != 0 ) free(misslx); return 0; } /* pack_gp__ */