58 INTEGER(mpi),
DIMENSION(:),
ALLOCATABLE ::
bitmap
59 INTEGER(mpi),
PARAMETER ::
bs = bit_size(1_mpi)
73 INTEGER(mpi),
INTENT(IN) :: im
74 INTEGER(mpi),
INTENT(IN) :: jm
75 INTEGER(mpi),
INTENT(IN) :: inc
83 INTEGER(mpi) :: icount
84 INTEGER(mpi) :: jcount
95 noffi=int(i-1,mpl)*int(i,mpl)*int(
ibfw,mpl)/2
101 noffi=int(j-1,mpl)*int(2*
n+2-j,mpl)/2
103 l=noffi/
bs+j+noffj/
bs
123 icount=min(icount+inc,
mxcnt)
125 IF (icount /= jcount)
THEN
149 INTEGER(mpi),
INTENT(IN) :: i
150 INTEGER(mpi),
INTENT(IN) :: j
153 INTEGER(mpi) :: noffj
155 INTEGER(mpl) :: noffi
157 IF(i >
nar.OR.j >
nac)
RETURN
178SUBROUTINE clbits(in,jreqpe,jhispe,jsngpe,jextnd,idimb,ispc)
183 INTEGER(mpi),
INTENT(IN) :: in
184 INTEGER(mpi),
INTENT(IN) :: jreqpe
185 INTEGER(mpi),
INTENT(IN) :: jhispe
186 INTEGER(mpi),
INTENT(IN) :: jsngpe
187 INTEGER(mpi),
INTENT(IN) :: jextnd
188 INTEGER(mpl),
INTENT(OUT) :: idimb
189 INTEGER(mpi),
INTENT(OUT) :: ispc
191 INTEGER(mpl) :: noffd
193 INTEGER(mpi) :: icount
208 IF (jextnd >= 0)
THEN
210 icount=max(jsngpe+1,jhispe)
211 icount=max(jreqpe,icount)
213 IF (icount >
mxcnt)
THEN
221 noffd=int(
n,mpl)*int(
n+1,mpl)*int(
ibfw,mpl)/2
225 mb=int(4.0e-6*real(
ndimb,mps),mpi)
227 WRITE(*,*)
'CLBITS: symmetric matrix of dimension',
n
228 WRITE(*,*)
'CLBITS: off-diagonal elements',noffd
230 WRITE(*,*)
'CLBITS: dimension of bit-array',
ndimb ,
'(',mb,
'MB)'
232 WRITE(*,*)
'CLBITS: dimension of bit-array',
ndimb ,
'(< 1 MB)'
256 INTEGER(mpi),
INTENT(IN) :: in
257 INTEGER(mpi),
INTENT(IN) :: inar
258 INTEGER(mpi),
INTENT(IN) :: inac
259 INTEGER(mpl),
INTENT(OUT) :: idimb
261 INTEGER(mpl) :: noffd
273 noffd=int(
n,mpl)*int(
n+1,mpl)/2
277 mb=int(4.0e-6*real(idimb,mps),mpi)
279 WRITE(*,*)
'PLBITS: symmetric matrix of dimension',
n,
'(',
nar,
nac,
')'
280 WRITE(*,*)
'PLBITS: off-diagonal elements',noffd,
'(',int(
nar,mpl)*int(
nac,mpl),
')'
282 WRITE(*,*)
'PLBITS: dimension of bit-array',idimb ,
'(',mb,
'MB)'
284 WRITE(*,*)
'PLBITS: dimension of bit-array',idimb ,
'(< 1 MB)'
301SUBROUTINE ndbits(npgrp,ndims,nsparr,ihst)
306 INTEGER(mpi),
DIMENSION(:),
INTENT(IN) :: npgrp
307 INTEGER(mpl),
DIMENSION(4),
INTENT(OUT) :: ndims
308 INTEGER(mpl),
DIMENSION(:,:),
INTENT(OUT) :: nsparr
309 INTEGER(mpi),
INTENT(IN) :: ihst
311 INTEGER(mpi) :: nwcp(0:1)
312 INTEGER(mpi) :: irgn(2)
313 INTEGER(mpi) :: inr(2)
314 INTEGER(mpi) :: ichunk
328 INTEGER(mpi) :: icount
329 INTEGER(mpi) :: iproc
330 INTEGER(mpi) :: iword
337 INTEGER(mpl) :: nskyln
338 INTEGER(mpl) :: noffi
339 INTEGER(mpl) :: noffj
346 INTEGER(mpi),
DIMENSION(:),
ALLOCATABLE :: lastRowInCol
348 ll=int(
n,mpl)*int(
nthrd,mpl)
349 CALL mpalloc(lastrowincol,ll,
'NDBITS: last (non zero) row in col.')
352 nd=npgrp(
n+1)-npgrp(1)
370 noffi=int(i-1,mpl)*int(i,mpl)*int(
ibfw,mpl)/2
400 npar=npar+npgrp(j+1)-npgrp(j)
401 IF (iproc == 0.AND.ihst > 0)
CALL hmpent(ihst,real(icount,mps))
405 IF (icount >=
ireqpe)
THEN
407 IF (icount <=
isngpe) next=2
408 iword=ibset(iword,mb+next-1)
409 inr(next)=inr(next)+npgrp(j+1)-npgrp(j)
410 IF (next /= last)
THEN
411 irgn(next)=irgn(next)+1
414 lastrowincol(jcol)=max(lastrowincol(jcol),i)
427 ntot=ntot+npar*(npgrp(i+1)-npgrp(i))
432 nsparr(1,ir)=irgn(jp)
452 irgn(jp)=int(nsparr(1,ir),mpi)
453 inr(jp)=int(nsparr(2,ir),mpi)
461 mm=int(mod(noffj,int(
bs,mpl)),mpi)
469 noffi=int(j-1,mpl)*int(j,mpl)*int(
ibfw,mpl)/2
470 ll=noffi/
bs+j+noffj/
bs
480 inr(next)=inr(next)+npgrp(j+1)-npgrp(j)
481 IF (next /= last)
THEN
482 irgn(next)=irgn(next)+1
494 IF (inr(jp) > 0)
THEN
497 IF ((nwcp(1) < nwcp(0)).OR.
iextnd > 0)
THEN
501 ndims(2) =ndims(2) +nwcp(icp)
502 ndims(jp+2)=ndims(jp+2)+nwcp(0)*(npgrp(i+1)-npgrp(i))
505 nsparr(1,ir)=nwcp(icp)
506 nsparr(2,ir)=nwcp(0)*(npgrp(i+1)-npgrp(i))
536 lastrowincol(i)=max(lastrowincol(i),lastrowincol(ll))
542 npar=npgrp(lastrowincol(i)+1)-npgrp(i)
543 nskyln=nskyln+npar*(npgrp(i+1)-npgrp(i))
548 nin=ndims(3)+ndims(4)
549 fracz=200.0*real(ntot,mps)/real(nd,mps)/real(nd-1,mps)
550 fracu=200.0*real(nin,mps)/real(nd,mps)/real(nd-1,mps)
551 fracs=200.0*real(nskyln,mps)/real(nd,mps)/real(nd+1,mps)
553 WRITE(*,*)
'NDBITS: number of diagonal elements',nd
554 WRITE(*,*)
'NDBITS: number of used off-diagonal elements',nin
555 WRITE(*,1000)
'fraction of non-zero off-diagonal elements', fracz
556 WRITE(*,1000)
'fraction of used off-diagonal elements', fracu
557 cpr=100.0*real(mpi*ndims(2)+mpd*ndims(3)+mps*ndims(4),mps)/real((mpd+mpi)*nin,mps)
558 WRITE(*,1000)
'compression ratio for off-diagonal elements', cpr
559 WRITE(*,1000)
'fraction inside skyline ', fracs
5601000
FORMAT(
' NDBITS: ',a,f6.2,
' %')
574SUBROUTINE pbsbits(npgrp,ibsize,nnzero,nblock,nbkrow)
579 INTEGER(mpi),
DIMENSION(:),
INTENT(IN) :: npgrp
580 INTEGER(mpi),
INTENT(IN) :: ibsize
581 INTEGER(mpl),
INTENT(OUT) :: nnzero
582 INTEGER(mpl),
INTENT(OUT) :: nblock
583 INTEGER(mpi),
DIMENSION(:),
INTENT(OUT) :: nbkrow
585 INTEGER(mpi) :: ichunk
588 INTEGER(mpi) :: igrpf
589 INTEGER(mpi) :: igrpl
590 INTEGER(mpi) :: iproc
591 INTEGER(mpi) :: ioffb
592 INTEGER(mpi) :: ioffg
600 INTEGER(mpi) :: irfrst
601 INTEGER(mpi) :: irlast
604 INTEGER(mpl) :: length
606 INTEGER(mpl) :: noffi
607 INTEGER(mpl),
PARAMETER :: two=2
608 INTEGER(mpi),
DIMENSION(:,:),
ALLOCATABLE :: rowBlocksToGroups
609 INTEGER(mpi),
DIMENSION(:),
ALLOCATABLE :: blockCounter
610 INTEGER(mpi),
DIMENSION(:),
ALLOCATABLE :: groupList
620 nd=npgrp(
n+1)-npgrp(1)
621 mb=(nd+
nac-1)/ibsize+1
623 length=int(mb,mpl)*int(
nthrd,mpl)
624 CALL mpalloc(blockcounter,length,
'PBBITS: block counter')
625 length=int(
n,mpl)*int(
nthrd,mpl)
626 CALL mpalloc(grouplist,length,
'PBBITS: group list')
630 CALL mpalloc(rowblockstogroups,two,length,
'mapping row blocks to par. groups (I)')
631 rowblockstogroups(:,:)=0
636 DO WHILE (igrpf <
n .AND. npgrp(igrpf+1) <= ir)
639 rowblockstogroups(1,i)=igrpf
641 DO WHILE (igrpl <
n .AND. npgrp(igrpl+1) < ir)
644 rowblockstogroups(2,i)=igrpl
656 irfrst=ibsize*(ib-1)+1
662 blockcounter(ioffb+1:ioffb+mb)=0
663 DO i=rowblockstogroups(1,ib),rowblockstogroups(2,ib)
664 noffi=int(i-1,mpl)*int(2*
n+2-i,mpl)/2
671 grouplist(ioffg+ngrp)=j
680 DO ir=max(irfrst,npgrp(i)),min(irlast,npgrp(i+1)-1)
684 DO jc=max(ir,npgrp(grouplist(ioffg+j))),npgrp(grouplist(ioffg+j)+1)-1
687 blockcounter(ioffb+jb)=blockcounter(ioffb+jb)+1
698 blockcounter(ioffb+jb)=blockcounter(ioffb+jb)+1
710 IF (blockcounter(ioffb+j) > 0)
THEN
711 nnzero=nnzero+blockcounter(ioffb+j)
713 nbkrow(ib)=nbkrow(ib)+1
733 WRITE(*,*)
'PBSBITS: number of used elements', nnzero
734 WRITE(*,1000)
'fraction of used elements', 200.0*real(nnzero,mps)/real(nd+
nac,mps)/real(nd+
nac+1,mps)
735 WRITE(*,*)
'PBSBITS: block size', ibsize
736 WRITE(*,*)
'PBSBITS: number of (used) blocks', nblock
737 WRITE(*,1000)
'fraction of used storage ', 100.0*real(ibsize*ibsize+1,mps)*real(nblock,mps)/real(2*nnzero,mps)
7381000
FORMAT(
' PBSBITS: ',a,f7.2,
' %')
756 INTEGER(mpi),
DIMENSION(:),
INTENT(IN) :: npgrp
757 INTEGER(mpi),
INTENT(IN) :: ibsize
758 INTEGER(mpl),
DIMENSION(:),
INTENT(IN) :: nsparr
759 INTEGER(mpl),
DIMENSION(:),
INTENT(OUT) :: nsparc
761 INTEGER(mpi) :: ichunk
764 INTEGER(mpi) :: igrpf
765 INTEGER(mpi) :: igrpl
766 INTEGER(mpi) :: iproc
767 INTEGER(mpi) :: ioffb
768 INTEGER(mpi) :: ioffg
776 INTEGER(mpi) :: irfrst
777 INTEGER(mpi) :: irlast
781 INTEGER(mpl) :: length
783 INTEGER(mpl) :: noffi
784 INTEGER(mpl),
PARAMETER :: two=2
785 INTEGER(mpi),
DIMENSION(:,:),
ALLOCATABLE :: rowBlocksToGroups
786 INTEGER(mpi),
DIMENSION(:),
ALLOCATABLE :: blockCounter
787 INTEGER(mpi),
DIMENSION(:),
ALLOCATABLE :: groupList
793 nd=npgrp(
n+1)-npgrp(1)
794 mb=(nd+
nac-1)/ibsize+1
796 length=int(mb,mpl)*int(
nthrd,mpl)
797 CALL mpalloc(blockcounter,length,
'PBBITS: block counter')
798 length=int(
n,mpl)*int(
nthrd,mpl)
799 CALL mpalloc(grouplist,length,
'PBBITS: group list')
803 CALL mpalloc(rowblockstogroups,two,length,
'mapping row blocks to par. groups (I)')
804 rowblockstogroups(:,:)=0
809 DO WHILE (igrpf <
n .AND. npgrp(igrpf+1) <= ir)
812 rowblockstogroups(1,i)=igrpf
814 DO WHILE (igrpl <
n .AND. npgrp(igrpl+1) < ir)
817 rowblockstogroups(2,i)=igrpl
828 irfrst=ibsize*(ib-1)+1
834 blockcounter(ioffb+1:ioffb+mb)=0
835 DO i=rowblockstogroups(1,ib),rowblockstogroups(2,ib)
836 noffi=int(i-1,mpl)*int(2*
n+2-i,mpl)/2
843 grouplist(ioffg+ngrp)=j
852 DO ir=max(irfrst,npgrp(i)),min(irlast,npgrp(i+1)-1)
856 DO jc=max(ir,npgrp(grouplist(ioffg+j))),npgrp(grouplist(ioffg+j)+1)-1
859 blockcounter(ioffb+jb)=blockcounter(ioffb+jb)+1
870 blockcounter(ioffb+jb)=blockcounter(ioffb+jb)+1
883 IF (blockcounter(ioffb+j) > 0)
THEN
905 WRITE(*,*)
'PBLBITS: column list constructed ',nsparr(mb+1)-nsparr(1),
' words'
923 INTEGER(mpi),
DIMENSION(:),
INTENT(IN) :: npgrp
924 INTEGER(mpl),
DIMENSION(:),
INTENT(OUT) :: nsparr
926 INTEGER(mpi) :: ichunk
934 INTEGER(mpl) :: nparc
936 INTEGER(mpl) :: noffi
940 nd=npgrp(
n+1)-npgrp(1)
952 noffi=int(i-1,mpl)*int(2*
n+2-i,mpl)/2
967 DO ir=npgrp(i),npgrp(i+1)-1
983 nsparr(ir+1)=npar+nparc
993 nsparr(i+1)=nsparr(i+1)+nsparr(i)
997 nsparr(i+1)=nsparr(i)+1
999 ntot=nsparr(nd+
nac+1)-nsparr(1)
1002 WRITE(*,*)
'PRBITS: number of diagonal elements',nd+
nac
1003 WRITE(*,*)
'PRBITS: number of used elements',ntot
1004 WRITE(*,1000)
'fraction of used elements', 200.0*real(ntot,mps)/real(nd+
nac,mps)/real(nd+
nac+1,mps)
10051000
FORMAT(
' PRBITS: ',a,f6.2,
' %')
1022 INTEGER(mpi),
DIMENSION(:),
INTENT(IN) :: npgrp
1023 INTEGER(mpl),
DIMENSION(:),
INTENT(IN) :: nsparr
1024 INTEGER(mpl),
DIMENSION(:),
INTENT(OUT) :: nsparc
1026 INTEGER(mpi) :: ichunk
1036 INTEGER(mpl) :: noffi
1037 INTEGER(mpl) :: noffr
1041 nd=npgrp(
n+1)-npgrp(1)
1052 noffi=int(i-1,mpl)*int(2*
n+2-i,mpl)/2
1054 DO ir=npgrp(i),npgrp(i+1)-1
1062 DO ic=max(ir,npgrp(j)),npgrp(j+1)-1
1074 noffr=
ndimb+int(ir-1,mpl)*int(
nac/
bs+1,mpl)+1
1100 WRITE(*,*)
'PCBITS: column list constructed ',nsparr(nd+
nac+1)-nsparr(1),
' words'
1115 INTEGER(mpi),
DIMENSION(:),
INTENT(IN) :: npgrp
1116 INTEGER(mpl),
DIMENSION(4),
INTENT(OUT) :: ndims
1118 INTEGER(mpi) :: nwcp(0:1)
1119 INTEGER(mpi) :: irgn(2)
1120 INTEGER(mpi) :: inr(2)
1122 INTEGER(mpl) :: noffi
1125 INTEGER(mpi) :: last
1126 INTEGER(mpi) :: lrgn
1127 INTEGER(mpi) :: next
1130 INTEGER(mpi) :: icount
1131 INTEGER(mpi) :: kbfw
1140 IF (
ibfw > 1) kbfw=2
1144 noffi=int(i-1,mpl)*int(i,mpl)*int(
ibfw,mpl)/2
1165 IF (icount > 0) ndims(1)=ndims(1)+1
1167 IF (icount >=
ireqpe)
THEN
1169 IF (icount <=
isngpe) next=2
1170 inr(next)=inr(next)+npgrp(j+1)-npgrp(j)
1171 IF (next /= last)
THEN
1172 irgn(next)=irgn(next)+1
1179 IF (inr(jp) > 0)
THEN
1184 IF ((nwcp(1) < nwcp(0)).OR.
iextnd > 0)
THEN
1188 ndims(2) =ndims(2) +nwcp(icp)
1189 ndims(jp+2)=ndims(jp+2)+nwcp(0)*(npgrp(i+1)-npgrp(i))
1209 INTEGER(mpi),
DIMENSION(:),
INTENT(IN) :: npgrp
1210 INTEGER(mpl),
DIMENSION(:,:),
INTENT(IN) :: nsparr
1211 INTEGER(mpi),
DIMENSION(:),
INTENT(OUT) :: nsparc
1218 INTEGER(mpl) :: ndiff
1219 INTEGER(mpl) :: noffi
1220 INTEGER(mpl) :: noffj
1226 INTEGER(mpi) :: ichunk
1227 INTEGER(mpi) :: next
1228 INTEGER(mpi) :: last
1240 noffi=int(i-1,mpl)*int(i,mpl)*int(
ibfw,mpl)/2
1245 ndiff=(nsparr(1,n1+1)-kl)*(npgrp(i+1)-npgrp(i))-(nsparr(2,n1+1)-l1)
1253 IF (ndiff == 0)
THEN
1254 DO k=npgrp(j),npgrp(j+1)-1
1262 nsparc(kl)=int(ll-l1,mpi)
1267 ll=ll+(npgrp(j+1)-npgrp(j))
1281 m=int(mod(noffj,int(
bs,mpl)),mpi)+jb
1286 noffi=int(j-1,mpl)*int(j,mpl)*int(
ibfw,mpl)/2
1287 l=noffi/
bs+j+noffj/
bs
1290 IF (ndiff == 0)
THEN
1291 DO k=npgrp(j),npgrp(j+1)-1
1299 nsparc(kl)=int(ll-l1,mpi)
1304 ll=ll+(npgrp(j+1)-npgrp(j))
1311 IF (ndiff /= 0)
THEN
1313 nsparc(kl)=int(ll-l1,mpi)
1324 WRITE(*,*)
'SPBITS: sparse structure constructed ',nsparr(1,n1),
' words'
1325 WRITE(*,*)
'SPBITS: dimension parameter of matrix',nsparr(2,1)
1327 WRITE(*,*)
'SPBITS: index of last used location',nsparr(2,n1)
1329 WRITE(*,*)
'SPBITS: index of last used double',nsparr(2,n1/2)
1330 WRITE(*,*)
'SPBITS: index of last used single',nsparr(2,n1)
1346 INTEGER(mpi),
INTENT(IN) :: in
1348 INTEGER(mpl) :: noffd
1354 noffd=int(
n2,mpl)*int(
n2-1,mpl)/2
1356 mb=int(4.0e-6*real(
ndimb2,mps),mpi)
1359 WRITE(*,*)
'CLBMAP: dimension of bit-map',
ndimb2 ,
'(',mb,
'MB)'
1361 WRITE(*,*)
'CLBMAP: dimension of bit-map',
ndimb2 ,
'(< 1 MB)'
1377 INTEGER(mpi),
INTENT(IN) :: im
1378 INTEGER(mpi),
INTENT(IN) :: jm
1383 INTEGER(mpi) :: noffj
1384 INTEGER(mpl) :: noffi
1392 noffi=int(i-1,mpl)*int(i-2,mpl)/2
1394 l=noffi/
bs+i+noffj/
bs
1411 INTEGER(mpi),
INTENT(IN) :: ngroup
1412 INTEGER(mpi),
DIMENSION(:,:),
INTENT(IN) :: npgrp
1413 INTEGER(mpi),
DIMENSION(:),
INTENT(OUT) :: npair
1416 INTEGER(mpl) :: noffi
1426 npair(i)=npair(i)+npgrp(2,i)-1
1427 noffi=int(i-1,mpl)*int(i-2,mpl)/2
1431 IF (btest(
bitmap(l),m))
THEN
1433 npair(i)=npair(i)+npgrp(2,j)
1434 npair(j)=npair(j)+npgrp(2,i)
1457 INTEGER(mpi),
INTENT(IN) :: ipgrp
1458 INTEGER(mpi),
INTENT(OUT) :: npair
1459 INTEGER(mpi),
DIMENSION(:),
INTENT(OUT) :: npgrp
1462 INTEGER(mpl) :: noffi
1463 INTEGER(mpi) :: noffj
1471 noffi=int(i-1,mpl)*int(i-2,mpl)/2
1476 IF (btest(
bitmap(l+noffj/
bs),mod(noffj,
bs)))
THEN
1484 noffi=int(i-1,mpl)*int(i-2,mpl)/2
1486 IF (btest(
bitmap(l+noffj/
bs),mod(noffj,
bs)))
THEN
subroutine pcbits(npgrp, nsparr, nsparc)
Analyze bit fields.
subroutine ndbits(npgrp, ndims, nsparr, ihst)
Analyze bit fields.
subroutine clbits(in, jreqpe, jhispe, jsngpe, jextnd, idimb, ispc)
Calculate bit (field) array size, encoding.
subroutine plbits(in, inar, inac, idimb)
Calculate bit field array size (PARDISO).
subroutine spbits(npgrp, nsparr, nsparc)
Create sparsity information.
subroutine irbits(i, j)
Fill bit fields (counters, rectangular part).
subroutine clbmap(in)
Clear (additional) bit map.
subroutine inbmap(im, jm)
Fill bit map.
subroutine ckbits(npgrp, ndims)
Check sparsity of matrix.
subroutine ggbmap(ipgrp, npair, npgrp)
Get paired (parameter) groups from map.
subroutine prbits(npgrp, nsparr)
Analyze bit fields.
subroutine gpbmap(ngroup, npgrp, npair)
Get pairs (statistic) from map.
subroutine pblbits(npgrp, ibsize, nsparr, nsparc)
Analyze bit fields.
subroutine pbsbits(npgrp, ibsize, nnzero, nblock, nbkrow)
Analyze bit fields.
subroutine inbits(im, jm, inc)
Fill bit fields (counters, triangular part).
subroutine hmpent(ih, x)
entry flt.pt.
integer(mpi) n2
matrix size (map)
integer(mpi) ireqpe
min number of pair entries
integer(mpl) ndimb2
dimension for bit map
integer(mpi) ibfw
bit field width
integer(mpi) iextnd
flag for extended storage (both 'halves' of sym.
integer(mpi) n
matrix size (counters, sparse, triangular part)
integer(mpi), parameter bs
number of bits in INTEGER(mpi)
integer(mpi) nspc
number of precision for sparse global matrix (1=D, 2=D+f)
integer(mpi) nar
additional rows (counters, sparse, rectangular part)
integer(mpi) isngpe
upper bound for pair entry single precision storage
integer(mpi), dimension(:), allocatable bitmap
fit field map for global parameters pairs (measurements)
integer(mpi) mxcnt
max value for bit field counters
integer(mpi) nac
additional columns (counters, sparse, rectangular part)
integer(mpi) nthrd
number of threads
integer(mpl) ndimb
dimension for bit (field) array
integer(mpi), dimension(:), allocatable bitfieldcounters
fit field counters for global parameters pairs (tracks)
(De)Allocate vectors and arrays.