-1

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

我正在使用的代码是:

模块变量

   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)

结束毕业典礼

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

      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' 会出错。谁能告诉我我做错了什么?

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

4

2 回答 2

3

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

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

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

write(*,*) gavenaa(:5)

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

如果您仍然找不到出错的地方,请尝试将代码减少到一个最小但完整的示例,以展示相同的问题。这样做通常会发现错误,但如果没有,如果你能给他们一些完整且直接编译的代码,其他人会更容易帮助你。

于 2013-01-31T19:41:11.510 回答
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是不正确的,但这似乎是不必要的,稍微精简您的代码将帮助您和我们正确诊断和解决您遇到的任何问题。

于 2013-01-31T14:07:00.280 回答