左右两侧数组的形状不符合
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' 的值固定为用户输入的数组边界值,因此您的循环仅迭代数组的一行,并且根据 d
和 dt
的选择,您将超过数组边界如果t > n
和none之间的行元素的区间dt
将被改变。看到您的计算将触及的元素很少,这让我觉得这是不对的。 j
的初始值也超出了数组的范围,因为除非明确说明范围,否则 Fortran 数组索引从 1 开始。
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' 的值固定为用户输入的数组边界值,因此您的循环仅迭代数组的一行,并且根据 d
和 dt
的选择,您将超过数组边界如果t > n
和none之间的行元素的区间dt
将被改变。看到您的计算将触及的元素很少,这让我觉得这是不对的。 j
的初始值也超出了数组的范围,因为除非明确说明范围,否则 Fortran 数组索引从 1 开始。