Fortran阵列添加错误

时间:2013-01-31 14:00:13

标签: arrays fortran addition

我正在尝试添加两个数组,但由于某种原因,目标数组只包含零。 当我编译并运行程序时,我没有得到任何错误,但输出文件是错误的。 在代码中,我调用dhscf,用数字填充数组Gnaatm和Gnascf,i(尝试)将其保存在gavenaa和gavenas中,再次调用dhscf以获取Gnaatm和Gnascf的新值。当我把所有这些数组写入文件gavenas en gavenaa似乎是空的,虽然Gnaatm和Gnascf不是。

我正在使用的代码是:

模块var

   real(dp), dimension(:), allocatable :: Gnaatm(:), Gnascf(:), gavenaa(:), &
 & gavenas(:)

结束模块

grdsam.f:

allocate (Gnaatm(nasize))
allocate (Gnascf(nasize))
allocate (gavenaa(nasize))
allocate (gavenas(nasize))

    call dhscf(.....)
    gavenaa = Gnaatm 
        gavenas = Gnascf

    do ipt = 1, npt

      call dhscf(....)
       gavenaa = Gnaatm + gavenaa
       gavenas = Gnascf + gavenas
    enddo

open(unit=12, file="Zgavenaatm.txt", status="replace")
  do iwrite = 1, nasize
    write(12, *), iwrite, gavenaa(iwrite), Gnaatm(iwrite) 
  enddo
close(12)

open(unit=12, file="Zgavenascf.txt", status="replace")
  do iwrite = 1, nasize
    write(12, *), iwrite, gavenas(iwrite), Gnascf(iwrite) 
  enddo
close(12)

deallocate (Gnaatm)
deallocate (Gnascf)
deallocate (gavenaa)
deallocate (gavenas)

结束grdsam

当我运行程序时,我没有收到错误,但输出文件是错误的。典型输出是这样的:

      10   0.0000000000000000      -2.35488624992556957E-015
      11   0.0000000000000000      -4.75822627213221874E-017
      12   0.0000000000000000      -7.16040821425613171E-014
      13   0.0000000000000000       8.33283089385797112E-021
      14   0.0000000000000000      -1.04121906025281556E-014

第二列仅包含零,但第三列确实包含数字。 因此阵列'Gnaatm'和'Gnascf'包含数字,但不知何故将它们添加到'gavenaa'和'gavenas'出错了。谁能告诉我我做错了什么?

PS。我在Ubuntu 12上使用gfortran编译器。

2 个答案:

答案 0 :(得分:3)

如果任何fortran编译器出现与添加两个数组这样基本的问题,我会感到非常惊讶,因此显示的代码不完全是您正在使用的代码,或者问题出现在部分代码中删去。

首先,你没有在这里显示它,所以我会问:你的代码中有implicit none吗?没有它就会继续浪费时间;它避免了许多“愚蠢”错误,例如拼写错误的变量名称。

其次,您是否尝试过将您感兴趣的数组(部分)写入屏幕的老式调试方法?只需加入一些声明,如

write(*,*) gavenaa(:5)

在赋值语句之后立即查看数组是否包含您期望的值。

如果您仍然找不到出错的地方,请尝试将代码缩减为最小但完整的示例,该示例会出现同样的问题。通常在执行此操作时会发现错误,但如果没有,如果您可以为他们提供一些完整且直接编译的代码,则其他人更容易帮助您。

答案 1 :(得分:1)

如果您只是在进行整个数组分配,为什么还要使用forall构造?由于所讨论的所有数组都具有相同的大小,因此可以简化此块:

gavenaa(1:nasize) = Gnaatm(1:nasize)
forall(icount = 1:nasize) 
    gavenas(icount) = Gnascf(icount) + gavenas(icount)
end forall

gavenaa = Gnaatm
gavenas = Gnascf + gavenas

同样在你的其余代码中。

我不能说你对forall的使用是不正确的,但这似乎是不必要的,减少你的代码有点帮助你和我们正确诊断和解决你遇到的任何问题。< / p>