我是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
该程序的输出被“杀死”
为什么?我做得不好?
答案 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_env
,INT32
就足够了。如果这不能解决您的问题,也许您的阵列太大了......您可能需要向我们展示更多代码。
P.P.S。响应其他源代码。 t
do循环从1变为total_time
,但您将第二个索引用作t+1
,这意味着最大值将为total_time+1
。这超过了current
的第二维。你有一个数组下标错误。如果使用下标边界进行编译检查,编译器将为您找到此信息。使用gfortran,可以使用-fcheck = all或-fbounds-check。