我正在编写一个子例程,它将常规向量转换为只有非零元素的向量。说,向量a=(0,0,1,2,3)'
(n乘1)。然后非零向量为c=(1,2,3)
,行索引记录为ic=(0,0,0,1,2,3)
,其中ic(1)=0
,ic(i+1)-ic(i)
是{{1}中非零元素的数目}行。向量索引i-th
的大小为3,因为存在3个非零条目。有关FYI,请参见稀疏矩阵Wiki:https://en.wikipedia.org/wiki/Sparse_matrix。
尽管简单,但在运行以下名为jc=(1,1,1)
的代码时遇到了麻烦
sparsem.f90
因此,三个打印!This subroutine coverts a regular sparse matrix a into a CSR form
MODULE SPARSEM
CONTAINS
SUBROUTINE vsparse(a,c,jc,ic,counta,ierr,myid)
IMPLICIT NONE
REAL(8), INTENT(IN):: a(:)
INTEGER, INTENT(IN):: counta,myid
REAL(8), INTENT(OUT):: c(counta)
INTEGER, INTENT(OUT):: jc(counta),ic(size(a)+1)
INTEGER:: ierr,countaa,i
character(len=90):: filename
ierr=0
jc=0
c=0.0d0
ic=0
PRINT *, 'SIZE OF A IN VSPARSE', size(a),count(a>0.0d0),counta
IF (COUNT(a>0.0d0) /= counta) THEN
ierr=1
PRINT *, 'ERROR: number count of non-zero a(i,j) is not', counta
ELSE
countaa=0
ic(1)=0
DO i=1,size(a)
IF (a(i) > 0.0d0 ) THEN
countaa=countaa+1
c(countaa)=a(i)
ic(i+1)=ic(i)+1
jc(countaa)=1
IF (countaa<100) PRINT *,'checkcheckcheck', a(i), &
countaa,jc(countaa),c(countaa),jc(1:5)
ELSE
ic(i+1)=ic(i)
END IF
END DO
PRINT *, 'JCJCJCJC',jc(1:5)
END IF
IF (myid==7) THEN
WRITE(filename,'("sparsedens_dcheck",I1,".txt")') myid+1
OPEN(UNIT=212101, FILE="/home/wenya/Workspace/Model4/valuef/"//filename,ACTION='write',status='replace')
DO i=1,counta+1
IF (i<=counta) THEN
WRITE(212101,*) c(i),jc(i)
ELSE
WRITE(212101,*) 0.0D0,0
END IF
END DO
CLOSE(212101)
END IF
return
END SUBROUTINE vsparse
END MODULE SPARSEM
代码应为jc
。但是从第二个打印1 1 1 1 1...
代码开始,结果是6750960 6750691 6750692...。jc
数组的大小为9,000,000。而且我知道第一个2250000元素是0。
要复制此问题,这是主程序
jc
我正在PROGRAM MAIN
USE SPARSEM
IMPICIT NONE
REAL(8):: dens_last(9000000)
REAL(8), ALLOCATABLE :: dens(:)
INTEGER, ALLOCATABLE :: ic(:),jc(:)
INTEGER:: i
dens_last(1:2250000)=0.0d0
dens_last(2250001:9000000)=1.0d0/6750000.0d0
ncount=count(dens_last>0.0d0)
ALLOCATE(dens(ncount), ic(9000000+1), jc(ncount)_
CALL VSPASEM(dens_last, dens, jc, ic, ncount,ierr)
DEALLOCATE(dens,ic,jc)
END PROGRAM MAIN
计算机上使用gfortran 6.3.0
和openmpi
的最新版本。尽管在此示例中未使用UBUNTU 17.04
,但在程序的其余部分中将使用它。有什么想法吗?谢谢!