左右两侧数组的形状不符合

Shape of arrays on the left and right sides do not conform

real*8, allocatable  :: psi(:,:), h(:,:)
integer              :: n
real*8               :: t, dt
complex*16           :: ci

write(*,*) ' number of grid points '
read(*,*) n
write(*,*) ' total time '
read(*,*) t
write(*,*) ' time step '
read(*,*) dt

ci = (0d0, 1d0)

allocate(psi(n,n), h(n,n))
do j = 0, t, dt
   psi(n,j) = psi(n,j) - ci * dt * h *psi(n,j)
end do

我基本上是在尝试以一种糟糕的方式传播波函数。但是这个项目告诉我要像这样传播。所以n是一个常量,h是一个n×n的数组。

为什么在do循环中一直提示左右两侧的数组形状不一致?我如何改进它使左右相等?

Gfortran 5.2 在其错误中发出更多信息:

    psi(n,j) = psi(n,j) - ci * dt * h *psi(n,j)
   1
Error: Incompatible ranks 0 and 2 in assignment at (1)

你的数组的 LHS 是等级 0,因为 psi(n,j) 是一个标量。在 RHS 上,psi(n,j) 的两个实例都是 0 阶标量,但 h 是 2 阶数组。你有:

scalar = scalar - scalar * scalar * rank 2 array * scalar
scalar = scalar - rank 2 array
scalar = rank 2 array

这是因为标量被提升为上述操作的适当维度的数组,因此它们作用于 h 的所有元素。要使两边的排名相等,您需要 select h 的单个元素或对其执行一些其他操作以将其缩减为标量。


值得注意的是,您的循环是否正确尚不清楚。 'n' 的值固定为用户输入的数组边界值,因此您的循环仅迭代数组的一行,并且根据 ddt 的选择,您将超过数组边界如果t > n和none之间的行元素的区间dt将被改变。看到您的计算将触及的元素很少,这让我觉得这是不对的。 j 的初始值也超出了数组的范围,因为除非明确说明范围,否则 Fortran 数组索引从 1 开始。