问题描述
我没有使用 fortran 的经验,但我需要定义变量 error
。
a = 3.086e18
error = ABS(((xCoord / a)**2 + (9 / 4)*(yCoord / a)**2 + (zCoord / a)**2 -1)**3 - (xCoord / a)**2 * (yCoord / a)**3 - (9 / 200) * (yCoord / a)**2 * (zCoord / a)**3)
运行代码时,出现 Incompatible ranks 0 and 1 in assignment
错误。
我对 fortran 一无所知,这个问题可能是微不足道的。你能告诉我问题出在哪里吗?
解决方法
这是一个小例子(灵感来自您的代码),以便更好地理解:
! example.f90
program main
implicit none
integer,dimension(2)::array !< Declaration of the array
real::a=3.086e18
real::error !< Scalar
integer::i
do i=1,2
array(i)=1 !< Initialization of the array
end do
error=array/a
print*,error
end program main
输出:
11 | error=array/a
| 1
Error: Incompatible ranks 0 and 1 in assignment at (1)
问题在于 error
是一个标量,而 array/a
是一个包含 2 个元素的数组(作为数组的声明)。您不能将数组存储在标量中(显然)。
为了使其工作,您需要将错误声明为 2 个元素的数组,如下所示:
real,dimension(2)::error
输出:
3.24044050E-19 3.24044050E-19
,
因此,请尝试在您的问题中包含更多详细信息。特别是变量声明、函数参数和预期输出。
在这种情况下,Fortran 中的计算是矢量化的,对数组的所有元素应用相同的数学公式。因为 xCoord
是一个向量,所以任何涉及 xCoord
的数学公式都会产生一个向量。
要修复错误,您可能只想保留结果中的最大值。您可以使用 maxval()
函数
error = maxval(abs(((xCoord / a)**2 + (9 / 4d0)*(yCoord / a)**2 &
+ (zCoord / a)**2 -1)**3 - (xCoord / a)**2 * (yCoord / a)**3 &
- (9 / 200d0) * (yCoord / a)**2 * (zCoord / a)**3))
另请注意,(9 / 4)
的结果是 2
而不是 2.25
,因为编译器假定您需要整数除法。要更正它,请键入 (9 / 4d0)
。
附注。 Fortran
= For
mula Tran
slation 这正是将公式应用于数组所有元素的过程。