NCEPLIBS-g2  3.4.7
reduce.f
Go to the documentation of this file.
1 
4 
42  SUBROUTINE reduce(KFILDO,JMIN,JMAX,LBIT,NOV,LX,NDG,IBIT,JBIT,KBIT,
43  1 NOVREF,IBXX2,IER)
44 
45  CHARACTER*1 CFEED
46 C
47  dimension jmin(ndg),jmax(ndg),lbit(ndg),nov(ndg)
48  dimension newbox(ndg),newboxp(ndg)
49 C NEWBOX( ) AND NEWBOXP( ) ARE AUTOMATIC ARRAYS.
50  dimension ntotbt(0:31),nboxj(0:31)
51  dimension ibxx2(0:30)
52 C
53  DATA ifeed/12/
54 C
55  ier=0
56  IF(lx.EQ.1)GO TO 410
57 C IF THERE IS ONLY ONE GROUP, RETURN.
58 C
59  cfeed=char(ifeed)
60 C
61 C INITIALIZE NUMBER OF NEW BOXES PER GROUP TO ZERO.
62 C
63  DO 110 l=1,lx
64  newbox(l)=0
65  110 CONTINUE
66 C
67 C INITIALIZE NUMBER OF TOTAL NEW BOXES PER J TO ZERO.
68 C
69  DO 112 j=0,31
70  ntotbt(j)=999999999
71  nboxj(j)=0
72  112 CONTINUE
73 C
74  iorigb=(ibit+jbit+kbit)*lx
75 C IBIT = BITS TO PACK THE JMIN( ).
76 C JBIT = BITS TO PACK THE LBIT( ).
77 C KBIT = BITS TO PACK THE NOV( ).
78 C LX = NUMBER OF GROUPS.
79  ntotbt(kbit)=iorigb
80 C THIS IS THE VALUE OF TOTAL BITS FOR THE ORIGINAL LX
81 C GROUPS, WHICH REQUIRES KBITS TO PACK THE GROUP
82 C LENGHTS. SETTING THIS HERE MAKES ONE LESS LOOPS
83 C NECESSARY BELOW.
84 C
85 C COMPUTE BITS NOW USED FOR THE PARAMETERS DEFINED.
86 C
87 C DETERMINE OTHER POSSIBILITES BY INCREASING LX AND DECREASING
88 C NOV( ) WITH VALUES GREATER THAN THRESHOLDS. ASSUME A GROUP IS
89 C SPLIT INTO 2 OR MORE GROUPS SO THAT KBIT IS REDUCED WITHOUT
90 C CHANGING IBIT OR JBIT.
91 C
92  jj=0
93 C
94  DO 200 j=min(30,kbit-1),2,-1
95 C VALUES GE KBIT WILL NOT REQUIRE SPLITS. ONCE THE TOTAL
96 C BITS START INCREASING WITH DECREASING J, STOP. ALSO, THE
97 C NUMBER OF BITS REQUIRED IS KNOWN FOR KBITS = NTOTBT(KBIT).
98 C
99  newboxt=0
100 C
101  DO 190 l=1,lx
102 C
103  IF(nov(l).LT.ibxx2(j))THEN
104  newbox(l)=0
105 C NO SPLITS OR NEW BOXES.
106  GO TO 190
107  ELSE
108  novl=nov(l)
109 C
110  m=(nov(l)-1)/(ibxx2(j)-1)+1
111 C M IS FOUND BY SOLVING THE EQUATION BELOW FOR M:
112 C (NOV(L)+M-1)/M LT IBXX2(J)
113 C M GT (NOV(L)-1)/(IBXX2(J)-1)
114 C SET M = (NOV(L)-1)/(IBXX2(J)-1)+1
115  130 novl=(nov(l)+m-1)/m
116 C THE +M-1 IS NECESSARY. FOR INSTANCE, 15 WILL FIT
117 C INTO A BOX 4 BITS WIDE, BUT WON'T DIVIDE INTO
118 C TWO BOXES 3 BITS WIDE EACH.
119 C
120  IF(novl.LT.ibxx2(j))THEN
121  GO TO 185
122  ELSE
123  m=m+1
124 C*** WRITE(KFILDO,135)L,NOV(L),NOVL,M,J,IBXX2(J)
125 C*** 135 FORMAT(/' AT 135--L,NOV(L),NOVL,M,J,IBXX2(J)',6I10)
126  GO TO 130
127  ENDIF
128 C
129 C THE ABOVE DO LOOP WILL NEVER COMPLETE.
130  ENDIF
131 C
132  185 newbox(l)=m-1
133  newboxt=newboxt+m-1
134  190 CONTINUE
135 C
136  nboxj(j)=newboxt
137  ntotpr=ntotbt(j+1)
138  ntotbt(j)=(ibit+jbit)*(lx+newboxt)+j*(lx+newboxt)
139 C
140  IF(ntotbt(j).GE.ntotpr)THEN
141  jj=j+1
142 C THE PLUS IS USED BECAUSE J DECREASES PER ITERATION.
143  GO TO 250
144  ELSE
145 C
146 C SAVE THE TOTAL NEW BOXES AND NEWBOX( ) IN CASE THIS
147 C IS THE J TO USE.
148 C
149  newboxtp=newboxt
150 C
151  DO 195 l=1,lx
152  newboxp(l)=newbox(l)
153  195 CONTINUE
154 C
155 C WRITE(KFILDO,197)NEWBOXT,IBXX2(J)
156 C197 FORMAT(/' *****************************************'
157 C 1 /' THE NUMBER OF NEWBOXES PER GROUP OF THE TOTAL',
158 C 2 I10,' FOR GROUP MAXSIZE PLUS 1 ='I10
159 C 3 /' *****************************************')
160 C WRITE(KFILDO,198) (NEWBOX(L),L=1,LX)
161 C198 FORMAT(/' '20I6/(' '20I6))
162 
163  ENDIF
164 C
165 C205 WRITE(KFILDO,209)KBIT,IORIGB
166 C209 FORMAT(/' ORIGINAL BITS WITH KBIT OF',I5,' =',I10)
167 C WRITE(KFILDO,210)(N,N=2,10),(IBXX2(N),N=2,10),
168 C 1 (NTOTBT(N),N=2,10),(NBOXJ(N),N=2,10),
169 C 2 (N,N=11,20),(IBXX2(N),N=11,20),
170 C 3 (NTOTBT(N),N=11,20),(NBOXJ(N),N=11,20),
171 C 4 (N,N=21,30),(IBXX2(N),N=11,20),
172 C 5 (NTOTBT(N),N=21,30),(NBOXJ(N),N=21,30)
173 C210 FORMAT(/' THE TOTAL BYTES FOR MAXIMUM GROUP LENGTHS BY ROW'//
174 C 1 ' J = THE NUMBER OF BITS PER GROUP LENGTH'/
175 C 2 ' IBXX2(J) = THE MAXIMUM GROUP LENGTH PLUS 1 FOR THIS J'/
176 C 3 ' NTOTBT(J) = THE TOTAL BITS FOR THIS J'/
177 C 4 ' NBOXJ(J) = THE NEW GROUPS FOR THIS J'/
178 C 5 4(/10X,9I10)/4(/10I10)/4(/10I10))
179 C
180  200 CONTINUE
181 C
182  250 pimp=((iorigb-ntotbt(jj))/float(iorigb))*100.
183 C WRITE(KFILDO,252)PIMP,KBIT,JJ
184 C252 FORMAT(/' PERCENT IMPROVEMENT =',F6.1,
185 C 1 ' BY DECREASING GROUP LENGTHS FROM',I4,' TO',I4,' BITS')
186  IF(pimp.GE.2.)THEN
187 C
188 C WRITE(KFILDO,255)CFEED,NEWBOXTP,IBXX2(JJ)
189 C255 FORMAT(A1,/' *****************************************'
190 C 1 /' THE NUMBER OF NEWBOXES PER GROUP OF THE TOTAL',
191 C 2 I10,' FOR GROUP MAXSIZE PLUS 1 ='I10
192 C 2 /' *****************************************')
193 C WRITE(KFILDO,256) (NEWBOXP(L),L=1,LX)
194 C256 FORMAT(/' '20I6)
195 C
196 C ADJUST GROUP LENGTHS FOR MAXIMUM LENGTH OF JJ BITS.
197 C THE MIN PER GROUP AND THE NUMBER OF BITS REQUIRED
198 C PER GROUP ARE NOT CHANGED. THIS MAY MEAN THAT A
199 C GROUP HAS A MIN (OR REFERENCE) THAT IS NOT ZERO.
200 C THIS SHOULD NOT MATTER TO THE UNPACKER.
201 C
202  lxnkp=lx+newboxtp
203 C LXNKP = THE NEW NUMBER OF BOXES
204 C
205  IF(lxnkp.GT.ndg)THEN
206 C DIMENSIONS NOT LARGE ENOUGH. PROBABLY AN ERROR
207 C OF SOME SORT. ABORT.
208 C WRITE(KFILDO,257)NDG,LXNPK
209 C 1 2 3 4 5 6 7 X
210 C257 FORMAT(/' DIMENSIONS OF JMIN, ETC. IN REDUCE =',I8,
211 C 1 ' NOT LARGE ENOUGH FOR THE EXPANDED NUMBER OF',
212 C 2 ' GROUPS =',I8,'. ABORT REDUCE.')
213  ier=715
214  GO TO 410
215 C AN ABORT CAUSES THE CALLING PROGRAM TO REEXECUTE
216 C WITHOUT CALLING REDUCE.
217  ENDIF
218 C
219  lxn=lxnkp
220 C LXN IS THE NUMBER OF THE BOX IN THE NEW SERIES BEING
221 C FILLED. IT DECREASES PER ITERATION.
222  ibxx2m1=ibxx2(jj)-1
223 C IBXX2M1 IS THE MAXIMUM NUMBER OF VALUES PER GROUP.
224 C
225  DO 300 l=lx,1,-1
226 C
227 C THE VALUES IS NOV( ) REPRESENT THOSE VALUES + NOVREF.
228 C WHEN VALUES ARE MOVED TO ANOTHER BOX, EACH VALUE
229 C MOVED TO A NEW BOX REPRESENTS THAT VALUE + NOVREF.
230 C THIS HAS TO BE CONSIDERED IN MOVING VALUES.
231 C
232  IF(newboxp(l)*(ibxx2m1+novref)+novref.GT.nov(l)+novref)THEN
233 C IF THE ABOVE TEST IS MET, THEN MOVING IBXX2M1 VALUES
234 C FOR ALL NEW BOXES WILL LEAVE A NEGATIVE NUMBER FOR
235 C THE LAST BOX. NOT A TOLERABLE SITUATION.
236  movmin=(nov(l)-(newboxp(l))*novref)/newboxp(l)
237  left=nov(l)
238 C LEFT = THE NUMBER OF VALUES TO MOVE FROM THE ORIGINAL
239 C BOX TO EACH NEW BOX EXCEPT THE LAST. LEFT IS THE
240 C NUMBER LEFT TO MOVE.
241  ELSE
242  movmin=ibxx2m1
243 C MOVMIN VALUES CAN BE MOVED FOR EACH NEW BOX.
244  left=nov(l)
245 C LEFT IS THE NUMBER OF VALUES LEFT TO MOVE.
246  ENDIF
247 C
248  IF(newboxp(l).GT.0)THEN
249  IF((movmin+novref)*newboxp(l)+novref.LE.nov(l)+novref.
250  1 and.(movmin+novref)*(newboxp(l)+1).GE.nov(l)+novref)THEN
251  GO TO 288
252  ELSE
253 C***D WRITE(KFILDO,287)L,MOVMIN,NOVREF,NEWBOXP(L),NOV(L)
254 C***D287 FORMAT(/' AT 287 IN REDUCE--L,MOVMIN,NOVREF,',
255 C***D 1 'NEWBOXP(L),NOV(L)',5I12
256 C***D 2 ' REDUCE ABORTED.')
257 C WRITE(KFILDO,2870)
258 C2870 FORMAT(/' AN ERROR IN REDUCE ALGORITHM. ABORT REDUCE.')
259  ier=714
260  GO TO 410
261 C AN ABORT CAUSES THE CALLING PROGRAM TO REEXECUTE
262 C WITHOUT CALLING REDUCE.
263  ENDIF
264 C
265  ENDIF
266 C
267  288 DO 290 j=1,newboxp(l)+1
268  move=min(movmin,left)
269  jmin(lxn)=jmin(l)
270  jmax(lxn)=jmax(l)
271  lbit(lxn)=lbit(l)
272  nov(lxn)=move
273  lxn=lxn-1
274  left=left-(move+novref)
275 C THE MOVE OF MOVE VALUES REALLY REPRESENTS A MOVE OF
276 C MOVE + NOVREF VALUES.
277  290 CONTINUE
278 C
279  IF(left.NE.-novref)THEN
280 C*** WRITE(KFILDO,292)L,LXN,MOVE,LXNKP,IBXX2(JJ),LEFT,NOV(L),
281 C*** 1 MOVMIN
282 C*** 292 FORMAT(' AT 292 IN REDUCE--L,LXN,MOVE,LXNKP,',
283 C*** 1 'IBXX2(JJ),LEFT,NOV(L),MOVMIN'/8I12)
284  ENDIF
285 C
286  300 CONTINUE
287 C
288  lx=lxnkp
289 C LX IS NOW THE NEW NUMBER OF GROUPS.
290  kbit=jj
291 C KBIT IS NOW THE NEW NUMBER OF BITS REQUIRED FOR PACKING
292 C GROUP LENGHTS.
293  ENDIF
294 C
295 C WRITE(KFILDO,406)CFEED,LX
296 C406 FORMAT(A1,/' *****************************************'
297 C 1 /' THE GROUP SIZES NOV( ) AFTER REDUCTION IN SIZE',
298 C 2 ' FOR'I10,' GROUPS',
299 C 3 /' *****************************************')
300 C WRITE(KFILDO,407) (NOV(J),J=1,LX)
301 C407 FORMAT(/' '20I6)
302 C WRITE(KFILDO,408)CFEED,LX
303 C408 FORMAT(A1,/' *****************************************'
304 C 1 /' THE GROUP MINIMA JMIN( ) AFTER REDUCTION IN SIZE',
305 C 2 ' FOR'I10,' GROUPS',
306 C 3 /' *****************************************')
307 C WRITE(KFILDO,409) (JMIN(J),J=1,LX)
308 C409 FORMAT(/' '20I6)
309 C
310  410 RETURN
311  END
312 
subroutine reduce(KFILDO, JMIN, JMAX, LBIT, NOV, LX, NDG, IBIT, JBIT, KBIT, NOVREF, IBXX2, IER)
This subroutine determines whether the number of groups should be increased in order to reduce the si...
Definition: reduce.f:44