Fortran代码只提供特定文件的输出

Fortran代码只提供特定文件的输出,fortran,mingw,gfortran,mingw-w64,Fortran,Mingw,Gfortran,Mingw W64,我有4.mtx文件,我正在从中读取值。其中两个在从中读取时运行良好,没有问题,并将正确的输出输出到.DAT文件中。但是,最后2个文件非常大;看起来代码从文件中正确读取并运行,但是我从这2个文件中读取时没有得到任何输出,也没有错误…甚至代码计时器也没有打印时间。非常感谢您的帮助!代码如下: program proj2matrixC40 implicit none integer,parameter::dp=selected_real_kind(15,307) ! Set Global Vari

我有4.mtx文件,我正在从中读取值。其中两个在从中读取时运行良好,没有问题,并将正确的输出输出到.DAT文件中。但是,最后2个文件非常大;看起来代码从文件中正确读取并运行,但是我从这2个文件中读取时没有得到任何输出,也没有错误…甚至代码计时器也没有打印时间。非常感谢您的帮助!代码如下:

program proj2matrixC40

implicit none
integer,parameter::dp=selected_real_kind(15,307)

! Set Global Variables

real(kind=dp), allocatable::Ax(:,:),A(:,:),Iglobal(:,:)
integer::At(1,3)
integer::nnz,w,n,k,ii,ff,kk
real(kind=dp)::t1,t2
call cpu_time(t1)
open(unit=78,file="e40r5000.mtx",status='old')
read(78,*) At
close(unit=78)
nnz = At(1,3)
n = At(1,1)
k = 40
kk = 35
allocate(Ax(nnz+1,3),A(nnz,3),Iglobal(k,k))
open(unit=61,file="e40r5000.mtx",status='old')
do w=1,nnz+1
   read(61,*) Ax(w,:)
end do
open (unit = 53, file = "proj2matrixC40points.dat")
do ff=1,k
   do ii=1,k
       Iglobal(ii,ff) = (ii/ff)*(ff/ii)
   end do
end do
A(1:nnz,:) = Ax(2:nnz+1,:)
call Arno(A)
call cpu_time(t2)
print '("Time elapsed = ",f10.8," seconds")', (t2 - t1)

contains

subroutine Arno(a)
real(kind=dp), intent(in)::a(:,:)
real(kind=dp),dimension(k,k)::H
real(kind=dp),dimension(k,k+1)::u,q,qconj
real(kind=dp),dimension(k,1)::x0
integer::j,f
call random_number(x0)
q(:,1) = x0(:,1)/norm2(x0(:,1))
do f=1,k
   call spmat(a,q(:,f),u(:,f))
   do j=1,f
      qconj(j,:) = (q(:,j))
      H(j,f) = dot_product(qconj(j,:),u(:,f))
      u(:,f) = u(:,f) - H(j,f)*q(:,j)
   end do
   if (f.lt.k) then
      H(f+1,f) = norm2(u(:,f))
      if (H(f+1,f)==0) then
         print *, "Matrix is reducible"
         stop
      end if
      q(:,f+1) = u(:,f)/H(f+1,f)
   end if
   if (f==k) then
      call qrit(H)
   end if
end do
end subroutine

! QR Iteration with Shifts Subroutine

subroutine qrit(a)
real(kind=dp), intent(in)::a(:,:)
real(kind=dp)::sigmak
real(kind=dp),dimension(kk,k)::dia
real(kind=dp),dimension(k,k)::Qfinal,Rfinal,HH
real(kind=dp),dimension(k,k,kk)::H0,needQR
integer::v,z
HH = a
   H0(:,:,1) = HH
   do v=1,kk
      sigmak = H0(k,k,v)
      if (v-1==0) then
          needQR(:,:,v) = HH - sigmak*Iglobal
      else
          needQR(:,:,v) = H0(:,:,v-1) - sigmak*Iglobal
      end if
      call givens2(needQR(:,:,v),Rfinal,Qfinal)
      H0(:,:,v) = matmul(Rfinal,Qfinal) + sigmak*Iglobal
      do z = 1,k
         dia(v,z) = H0(z,z,v)
         write(53,*) v," ", dia(v,z) ! Write values to .DAT file
      end do
   end do
end subroutine

! Sparse Matrix Vector Multiplication Subroutine

subroutine spmat(a,b,c)
real(kind=dp), intent(in)::a(:,:)
real(kind=dp), intent(in), dimension(k,1)::b
real(kind=dp), intent(out), dimension(k,1)::c
integer::m,rowi,columni
real(kind=dp), dimension(k,1)::x,y
x = b
y(:,1) = 0
do m = 1,nnz
   rowi = a(m,1)
   columni = a(m,2)
   y(rowi,1) = y(rowi,1) + a(m,3)*x(columni,1)
end do
c(:,1) = y(:,1)
end subroutine

! QR Factorization Givens Rotations Subroutine

subroutine givens2(a,Rfinal,Qfinal)
real(kind=dp), intent(in)::a(:,:)
real(kind=dp), dimension(k,k,(k*k))::G,QQ
real(kind=dp), dimension(k,k), intent(out)::Rfinal,Qfinal
real(kind=dp), dimension(k,k)::I2,y,aa
real(kind=dp), dimension(1,k)::ek1,ek2
real(kind=dp)::c,s
integer::kt,m,nn,j,i,l,p
m = size(a,1)
nn = size(a,2)
aa = a
i = 1
do kt=1,nn-1
   do j=m,kt+1,-1
      if (aa(j,kt).eq.0) then
          continue
      else
         ek1(1,:) = 0
         ek2(1,:) = 0
         do p=1,m
            do l=1,m
               I2(l,p) = (l/p)*(p/l)
            end do
         end do
         c = aa(kt,kt)/sqrt(aa(kt,kt)**2 + aa(j,kt)**2)
         s = aa(j,kt)/sqrt(aa(kt,kt)**2 + aa(j,kt)**2)
         ek1(1,kt) = c
         ek1(1,j) = s
         ek2(1,kt) = -s
         ek2(1,j) = c
         I2(kt,:) = ek1(1,:)
         I2(j,:) = ek2(1,:)    
         G(:,:,i) = I2
         if (i.eq.1) then
            QQ(:,:,i) = G(:,:,i)
         else 
            QQ(:,:,i) = matmul(G(:,:,i),QQ(:,:,i-1))
         end if
         y = matmul(G(:,:,i),aa)
         aa = y
         if (kt.eq.nn-1) then
            if (j.eq.kt+1) then
               Qfinal = transpose(QQ(:,:,i))
               Rfinal = aa
            end if
         end if
         i = i + 1
      end if
   end do
end do
end subroutine

end program proj2matrixC40
几张便条。我在这个问题上用星号标出的那一行叫做mat_print'H',H不能删除,否则我会得到错误的答案,这很奇怪…想法?。另外,为了防止您的计算机冻结打开大文件,它们的名称是'e40r5000.mtx'和's3dkt3m2.mtx',这是我遇到的两个问题。我正在使用gfortran版本8.1.0

这是文件的链接


当您需要添加对子例程的调用,而该子例程实际上不应该更改任何内容以使其正常工作时,可能会出现内存损坏。当您访问阵列边界之外的阵列时,这种情况最常见

我用一些运行时检查编译了它:

gfortran -o p2m -g -O0 -fbacktrace -fcheck=all -Wall proj2mat.f90
它已经给了我一些问题:

它警告我隐式类型转换。如果您信任您的数据,那么这应该不是一个太大的问题。 在第46行中,数组长度不匹配x0:,1的长度为40,q:,1的长度为41 类似地,在第108行x=Bx确实很大,但b只有41长。
我现在已经停止了,但我恳请您仔细检查您的代码并将其清理干净。使用上面的编译器选项,它将让您知道何时何地存在数组绑定冲突。

当您需要添加对子例程的调用,而该子例程实际上不应更改任何内容以使其正常工作时,可能存在内存损坏。当您访问阵列边界之外的阵列时,这种情况最常见

我用一些运行时检查编译了它:

gfortran -o p2m -g -O0 -fbacktrace -fcheck=all -Wall proj2mat.f90
它已经给了我一些问题:

它警告我隐式类型转换。如果您信任您的数据,那么这应该不是一个太大的问题。 在第46行中,数组长度不匹配x0:,1的长度为40,q:,1的长度为41 类似地,在第108行x=Bx确实很大,但b只有41长。
我现在已经停止了,但我恳请您仔细检查您的代码并将其清理干净。使用上面的编译器选项,它会让您知道何时何地存在数组绑定冲突。

他说文件非常大(大约500k行),这不是开玩笑。但是代码中有太多奇怪的决定。一些示例:在子例程qrit中有一个嵌套循环,只有当两个迭代器相同时才会执行循环体。在spmat中有一个dol=1,1当他说文件非常大(大约500k行)时,他不是在开玩笑。但是代码中有很多奇怪的决定。一些示例:在子例程qrit中有一个嵌套循环,只有当两个迭代器相同时才会执行循环体。在spmat中,有一个do l=1,1使用gfortran-g-O0-fbacktrace-fcheck=all proj2matrixC40.f08运行的固定问题,这修复了call语句的问题。前两个矩阵仍然运行正常。然而,现在我得到的错误声明程序接收信号SIGSEGV:分段错误-无效内存引用。当从两个大文件中读取但没有禁止访问的数组时,我应该在读取前两个文件时出错!。我甚至尝试了gfortran-fmax array constructor=1000000-fmax stack var size=1000000 proj2matrixC40.f08,但都没有成功。将问题中的代码改为现在更新的代码解决了:谢谢你的帮助!修复了使用gfortran-g-O0-fbacktrace-fcheck=all proj2matrixC40.f08运行的问题,并修复了call语句的问题。前两个矩阵仍然运行正常。然而,现在我得到的错误声明程序接收信号SIGSEGV:分段错误-无效内存引用。当从两个大文件中读取但没有禁止访问的数组时,我应该在读取前两个文件时出错!。我甚至尝试了gfortran-fmax array constructor=1000000-fmax stack var size=1000000 proj2matrixC40.f08,但都没有成功。将问题中的代码改为现在更新的代码解决了:谢谢你的帮助!