18 INTEGER(KIND=large) :: ndimb
25 INTEGER,
DIMENSION(:),
ALLOCATABLE :: bitFieldCounters
35 SUBROUTINE inbits(im,jm,inc) ! include element (I,J)
38 INTEGER,
INTENT(IN) :: im
39 INTEGER,
INTENT(IN) :: jm
40 INTEGER,
INTENT(IN) :: inc
42 INTEGER(KIND=large) :: l
43 INTEGER(KIND=large) :: ll
60 noffi=int8(i-1)*int8(i-2)*int8(ibfw)/2
66 bitfieldcounters(l)=ibset(bitfieldcounters(l),m)
73 IF (btest(bitfieldcounters(ll),mm)) icount=ibset(icount,ib)
82 icount=min(icount+inc,mxcnt)
84 IF (icount /= jcount)
THEN
88 IF (btest(icount,ib))
THEN
89 bitfieldcounters(ll)=ibset(bitfieldcounters(ll),mm)
91 bitfieldcounters(ll)=ibclr(bitfieldcounters(ll),mm)
116 INTEGER,
INTENT(IN) :: in
117 INTEGER(KIND=large),
INTENT(OUT) :: idimb
118 INTEGER,
INTENT(OUT) :: iencdb
119 INTEGER,
INTENT(IN) :: jbfw
130 noffd=int8(n)*int8(n-1)*int8(ibfw)/2
133 mb=int(4.0e-6*float(ndimb))
135 WRITE(*,*)
'CLBITS: symmetric matrix of dimension',n
136 WRITE(*,*)
'CLBITS: off-diagonal elements',noffd
138 WRITE(*,*)
'CLBITS: dimension of bit-array',ndimb ,
'(',mb,
'MB)'
140 WRITE(*,*)
'CLBITS: dimension of bit-array',ndimb ,
'(< 1 MB)'
142 CALL
mpalloc(bitfieldcounters,ndimb,
'INBITS: bit storage')
147 IF (btest(n,i)) nbcol=i+1
151 nencdm=ishft(1,nencdb)-1
167 SUBROUTINE ndbits(ndims,ncmprs,nsparr,mnpair,ihst,jcmprs)
170 INTEGER(KIND=large),
DIMENSION(4),
INTENT(OUT) :: ndims
171 INTEGER,
DIMENSION(:),
INTENT(OUT) :: ncmprs
172 INTEGER(KIND=large),
DIMENSION(:,:),
INTENT(OUT) :: nsparr
173 INTEGER,
INTENT(IN) :: mnpair
174 INTEGER,
INTENT(IN) :: ihst
175 INTEGER,
INTENT(IN) :: jcmprs
202 INTEGER(KIND=large) :: ll
203 INTEGER(KIND=large) :: lb
204 INTEGER(KIND=large) :: nin
205 INTEGER(KIND=large) :: ntot
222 ichunk=min((n+nthrd-1)/nthrd/32+1,256)
223 IF (ibfw > 1.OR.icmprs /= 0)
THEN
224 IF (ibfw > 1.AND.icmprs > 0) kbfw=2
226 IF (nthrd > 1) jbfw=ibfw
235 noffi=int8(i-1)*int8(i-2)*int8(ibfw)/2
238 noffi=int8(i-1)*int8(i-2)*int8(jbfw)/2
255 IF (btest(bitfieldcounters(ll),mm)) icount=ibset(icount,ib)
263 bitfieldcounters(lb)=ibclr(bitfieldcounters(lb),mb+jb)
268 IF (iproc == 0.AND.ihst > 0) CALL hmpent(ihst,float(icount))
271 IF (icount >= mnpair)
THEN
273 IF (icount <= icmprs.AND.icmprs > 0) next=2
274 inr(next)=inr(next)+1
275 bitfieldcounters(lb)=ibset(bitfieldcounters(lb),mb+next-1)
276 IF (next /= last.OR.lrgn >= nencdm)
THEN
277 irgn(next)=irgn(next)+1
293 IF (inr(jp) > 0)
THEN
294 nwcp(1)=irgn(jp)+(irgn(jp)+7)/8
296 IF (nwcp(1) < nwcp(0).AND.icmprs /= 0)
THEN
298 ncmprs(i+n*(jp-1))=irgn(jp)
300 ndims(2) =ndims(2) +nwcp(icp)
301 ndims(jp+2)=ndims(jp+2)+nwcp(0)
304 nsparr(1,ir+1)=nwcp(icp)
305 nsparr(2,ir+1)=nwcp(0)
329 IF (jbfw /= kbfw)
THEN
331 noffi=int8(i-1)*int8(i-2)*int8(jbfw)/2
333 noffi=int8(i-1)*int8(i-2)*int8(kbfw)/2
337 bitfieldcounters(lb+k)=bitfieldcounters(ll+k)
343 noffi=int8(n)*int8(n-1)*int8(ibfw)/2
354 noffi=int8(i-1)*int8(i-2)/2
359 IF(btest(bitfieldcounters(ll+k),m)) nin=nin+1
363 nsparr(1,n1)=nsparr(1,1)+nin
364 nsparr(2,n1)=nsparr(2,1)+nin
372 nin=ndims(3)+ndims(4)
373 fracz=200.0*float(ntot)/float(n)/float(n-1)
374 fracu=200.0*float(nin)/float(n)/float(n-1)
376 WRITE(*,*)
'NDBITS: number of diagonal elements',n
377 WRITE(*,*)
'NDBITS: number of used off-diagonal elements',nin
378 WRITE(*,1000)
'fraction of non-zero off-diagonal elements', fracz
379 WRITE(*,1000)
'fraction of used off-diagonal elements', fracu
380 IF (icmprs /= 0)
THEN
381 cpr=100.0*float(ndims(2)+2*ndims(3)+ndims(4))/float(3*nin)
382 WRITE(*,1000)
'compression ratio for off-diagonal elements', cpr
384 1000 format(
' NDBITS: ',a,f6.2,
' %')
398 INTEGER(KIND=large),
DIMENSION(4),
INTENT(OUT) :: ndims
399 INTEGER,
INTENT(IN) :: mnpair
400 INTEGER,
INTENT(IN) :: jcmprs
405 INTEGER(KIND=large) :: ll
426 IF (ibfw > 1.AND.icmprs > 0) kbfw=2
430 noffi=int8(i-1)*int8(i-2)*int8(ibfw)/2
443 IF (btest(bitfieldcounters(ll),mm)) icount=ibset(icount,ib)
451 IF (icount > 0) ndims(1)=ndims(1)+1
453 IF (icount >= mnpair)
THEN
455 IF (icount <= icmprs.AND.icmprs > 0) next=2
456 inr(next)=inr(next)+1
457 IF (next /= last.OR.lrgn >= nencdm)
THEN
458 irgn(next)=irgn(next)+1
466 IF (icmprs /= 0)
THEN
468 IF (inr(jp) > 0)
THEN
471 nwcp(1)=irgn(jp)+(irgn(jp)+7)/8
473 IF (nwcp(1) < nwcp(0)) icp=1
474 ndims(2) =ndims(2) +nwcp(icp)
475 ndims(jp+2)=ndims(jp+2)+nwcp(0)
479 ndims(2)=ndims(2)+inr(1)
480 ndims(3)=ndims(3)+inr(1)
494 SUBROUTINE spbits(nsparr,nsparc,ncmprs) ! collect elements
498 INTEGER(KIND=large),
DIMENSION(:,:),
INTENT(IN) :: nsparr
499 INTEGER,
DIMENSION(:),
INTENT(OUT) :: nsparc
500 INTEGER,
DIMENSION(:),
INTENT(IN) :: ncmprs
502 INTEGER(KIND=large) :: kl
503 INTEGER(KIND=large) :: l
504 INTEGER(KIND=large) :: ll
505 INTEGER(KIND=large) :: l1
506 INTEGER(KIND=large) :: k8
507 INTEGER(KIND=large) :: n1
523 ichunk=min((n+nthrd-1)/nthrd/32+1,256)
533 noffi=int8(i-1)*int8(i-2)*int8(ibfw)/2
550 IF(bitfieldcounters(l) /= 0)
THEN
551 IF(btest(bitfieldcounters(l),m))
THEN
558 IF (last == 0.OR.jn >= nencdm)
THEN
559 IF (mod(lrgn,8) == 0)
THEN
561 nsparc(k8)=int(ll-l1)
569 nsparc(kl)=ior(j1,jn)
588 WRITE(*,*)
'SPBITS: sparse structure constructed ',nsparr(1,n1),
' words'
589 WRITE(*,*)
'SPBITS: dimension parameter of matrix',nsparr(2,1)-1
591 WRITE(*,*)
'SPBITS: index of last used location',nsparr(2,n1)-1
593 WRITE(*,*)
'SPBITS: index of last used double',nsparr(2,n1/2)-1
594 WRITE(*,*)
'SPBITS: index of last used single',nsparr(2,n1)-1