什么导致fotran等级不匹配错误

问题描述

我没有使用 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 = Formula Translation 这正是将公式应用于数组所有元素的过程。