Fortran数组分配删除现在不正确的解决方案

时间:2013-07-01 20:26:32

标签: arrays matrix fortran gfortran

我正在写一个程序。该程序解决了矩阵。矩阵与用户在命令行参数中指定的一样大。我希望程序解决非常大的矩阵,所以当我完成所有线性代数的东西,包括umfpack,lapack,suitespares,arpack ......我试图通过删除未使用的数组来释放内存空间。我找到了3个完全未使用的数组,这些数组仅用于调试解决矩阵的其他问题。

当我从声明和分配中删除变量时,程序开始表现不同。矩阵解决方案现在错了。我已经回到我的备份文件,它仍然可以正常工作。我肯定删除声明并分配未使用的数组会阻止我的程序找到正确的解决方案。

我已经玩了几天这个问题了。我真的无法想象删除未使用的数组如何改变程序的执行。任何帮助表示赞赏。

 program HHSolver
    use MathOperations
    integer :: O, NEV, i, j, k, a, col, row
    integer :: coeff, p, b, NTerms, NextCoeff
    integer :: m, n, symbolic, numeric
    integer :: TermIndex, ido, NCV,LDV, LWorkL, info2,ierr
    double precision :: x, y, sigmai, sigmar
    Character(128) :: String, term, factor
    character(1) :: bmat
    character(2) :: which
    double precision, dimension(:, :), allocatable :: polynomial        !this stores the polynomial boundary equation      
    double precision, dimension(:, :), allocatable :: lap           !this stores the polynomial boundary equation      
    double precision, dimension(:, :), allocatable :: temp          !this stores the polynomial boundary equation      
    double precision, dimension(:, :), allocatable :: R         !this stores the polynomial boundary equation           
    double precision, dimension(:, :), allocatable :: vec           !this stores the polynomial boundary equation           
    double precision, dimension(:, :), allocatable :: lwork         !this stores the polynomial boundary equation           
    double precision, dimension(:), allocatable :: alphar, beta 
    double precision, dimension(:), allocatable :: alphai, work 
    double precision, dimension(1, 1) :: dummy
    double precision, dimension(:), allocatable :: RESID        
    double precision, dimension(:, :), allocatable :: V, z
    double precision, dimension(:), allocatable :: workd, workl
    double precision, dimension(:), allocatable :: workev
    double precision, dimension(:), allocatable :: Ax, DI, DR
    integer, dimension(:), allocatable :: Ap, Ai
    integer, dimension(11) :: IPARAM
    integer, dimension(14) :: IPNTR     
    integer, dimension(1) :: h
    double precision :: control(20), info(90), tol
    logical, dimension(:), allocatable :: select
    logical :: rvec(1)
    double precision, dimension(:), allocatable :: tempvec

    external daxpy, dnrm2, dpttrf, dpttrs, dlapy2
    intrinsic abs

    call get_command_argument(1, String)
    read(String, '(i10)') O
    call get_command_argument(2, String)
    read(String, '(i10)') NEV
    call get_command_argument(3, String)

    write(*, *) 'try to allocate enough memory for full matrices'

    !this is wh the matrix is created
    allocate(lap((O + 1)**2, (O + 1)**2)) !this stores the polynomial boundary equation             
    allocate(temp((O + 1)**2, (O + 1)**2)) !this stores the polynomial boundary equation            
    allocate(R((O + 1)**2, (O + 1)**2)) !this stores the polynomial boundary equation           
    allocate(alphar((O+1)**2)) !this stores the polynomial boundary equation            
    allocate(alphai((O+1)**2)) !this stores the polynomial boundary equation            
    allocate(beta((O+1)**2)) !this stores the polynomial boundary equation              
    allocate(vec((O + 1)**2, (O + 1)**2)) !this stores the polynomial boundary equation             
    allocate(work(8*((O+1)**2))) !this stores the polynomial boundary equation              
    allocate(lwork(2*((O+1)**2), 2*((O+1)**2))) !this stores the polynomial boundary equation           
    allocate(RESID((O+1)**2)) !this stores the initial and last eigenvector
    allocate(V((O+1)**2,20+NEV)) !this stores the eigenvectors
    allocate(workd(3*((O+1)**2))) !this stores the eigenvectors             
    allocate(workl(30*(20+NEV)**2 + 60*(20+NEV))) !this stores the eigenvectors             
    allocate(workev(3*(20+NEV))) !this stores the eigenvectors              
    allocate(tempvec((O+1)**2)) !this stores the eigenvectors               
    allocate(DI(NEV+1)) !this stores the eigenvectors               
    allocate(DR(NEV+1)) !this stores the eigenvectors               
    allocate(select(20+NEV)) !this stores the eigenvectors              
    allocate(z((O+1)**2,1+NEV)) !this stores the eigenvectors

    write(*, *) 'memory for matrices allocated'     

            !create the matrix to be solved
            !solver the matrix

    write(*, '(25F20.5)') DI   !these are the real and imaginary part of solution
    write(*, '(25F20.5)') DR
  end program

当我尝试删除alphai,alphar,lwork时,一切都崩溃了。它们甚至没有被使用。

1 个答案:

答案 0 :(得分:2)

您描述了:未使用的数组,如果您删除,您的程序会给出错误的答案。一种可能性是使用的其他一些数组声明太小。在删除使用过的数组之后,这些数组在内存中重叠,并且由于重叠而被错误地更改。以前,当你有额外的数组时,幸运的是,它们为数组或数组太小而提供了额外的存储空间。

您可以通过初始化未使用的数组来测试,然后在程序结束时查看是否有任何值发生了变化。

您可以查看所有阵列的尺寸。

在模块中具有所有过程(子例程和函数)以使编译器知道它们的接口将允许编译器检查它们被调用的实际参数与它们的伪参数之间的一致性。 external声明表明您没有使用Fortran> = 90提供的帮助。

使用编译器的所有错误和警告选项(包括运行时下标检查)可能会发现问题。如果数组已经以一种信息丢失的方式传递给子程序,这可能没有帮助。使用gfortran,请尝试:-fimplicit-none -Wall -Wline-truncation -Wcharacter-truncation -Wsurprising -Waliasing -Wimplicit-interface -Wunused-parameter -fwhole-file -fcheck=all -fbacktrace