上限DO Fortran

时间:2013-03-05 03:31:02

标签: fortran

我是Fortran的新手,我遇到了这个问题。

当我跑这个DO时没问题:

integer, parameter :: Int10Type = selected_int_kind (10)
INTEGER (Int10Type), PARAMETER :: TOTAL_TIME = 1000, TOTAL_INI = 200
INTEGER (Int10Type):: t, z
REAL (16), DIMENSION(TOTAL_Z, TOTAL_TIME) :: current
DO t = 1, TOTAL_TIME
   current(TOTAL_Z, t) = TEMP_INI
END DO
DO t = 1, TOTAL_TIME - 1
  DO z = 2, (TOTAL_Z - 1)
    current(z, t + 1) = current (z, t) + KAPPA*DELTA_T*((current(z - 1, t) -2.0*current(z, t) + current(z + 1, t)) / DELTA_Z**2)
  END DO
END DO

但是,当我增加var limite

    integer, parameter :: Int10Type = selected_int_kind (10)
INTEGER (Int10Type), PARAMETER :: TOTAL_TIME = 1000000000, TOTAL_INI = 200
INTEGER (Int10Type):: t, z
REAL (16), DIMENSION(TOTAL_Z, TOTAL_TIME) :: current
DO t = 1, TOTAL_TIME
   current(TOTAL_Z, t) = TEMP_INI
END DO
DO t = 1, TOTAL_TIME - 1
  DO z = 2, (TOTAL_Z - 1)
    current(z, t + 1) = current (z, t) + KAPPA*DELTA_T*((current(z - 1, t) -2.0*current(z, t) + current(z + 1, t)) / DELTA_Z**2)
  END DO
END DO

该程序的输出被“杀死”
为什么?我做得不好?

1 个答案:

答案 0 :(得分:1)

integer(10)表示integer(kind=10),而不是具有至少10位小数的整数。由编译器决定什么类型= 10表示。不能保证kind = 10甚至存在!如果要指定10位小数,则应使用:

integer, parameter :: Int10Type = selected_int_kind (10)
integer (kind=Int10Type) :: i

然后将您的程序编写为:

integer, parameter :: Int10Type = selected_int_kind (10)

INTEGER (Int10Type), PARAMETER :: limite = 1000000000_Int10Type, lim = 200
INTEGER (Int10Type):: i, j
DO i = 1, limite
  DO j = 1, lim
     !I work with a matrix
  END DO
END DO

请注意,该类型也已在大常量值上指定。

或者,如果您的编译器提供Fortran 2003的ISO Fortran环境功能,您可以以可移植的方式请求8字节(64位)整数:

use iso_fortran_env

INTEGER (INT64), PARAMETER :: limite = 1000000000_INT64, lim = 200
INTEGER (INT64):: i, j
DO i = 1, limite
  DO j = 1, lim
     !I work with a matrix
  END DO
END DO

P.S。 1000000000应该适合4字节(带符号)整数,因为2 ** 31 = 2,147,483,648,所以大多数Fortran编译器的默认整数应该有效。您可以在不指定类型的情况下使用integer!使用iso_fortran_envINT32就足够了。如果这不能解决您的问题,也许您的阵列太大了......您可能需要向我们展示更多代码。

P.P.S。响应其他源代码。 t do循环从1变为total_time,但您将第二个索引用作t+1,这意味着最大值将为total_time+1。这超过了current的第二维。你有一个数组下标错误。如果使用下标边界进行编译检查,编译器将为您找到此信息。使用gfortran,可以使用-fcheck = all或-fbounds-check。