Fortran阵列条目损坏了吗?

时间:2018-07-31 12:48:11

标签: fortran mpi gfortran

我正在编写一个子例程,它将常规向量转换为只有非零元素的向量。说,向量a=(0,0,1,2,3)'(n乘1)。然后非零向量为c=(1,2,3),行索引记录为ic=(0,0,0,1,2,3),其中ic(1)=0ic(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.0openmpi的最新版本。尽管在此示例中未使用UBUNTU 17.04,但在程序的其余部分中将使用它。有什么想法吗?谢谢!

0 个答案:

没有答案