Fortran语言的上限
我是Fortran新手,我有这个问题 当我运行此操作时,它是可以的:Fortran语言的上限,fortran,Fortran,我是Fortran新手,我有这个问题 当我运行此操作时,它是可以的: 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,
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
程序的输出被“终止”为什么?我做了什么坏事?
整数(10)
的意思是整数(种类=10)
,而不是至少有10位小数的整数。种类=10意味着什么,这取决于编译器。没有人能保证这类=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
由于2**31=2147483648,p.S.100000000应该适合4字节(有符号)整数,因此大多数Fortran编译器的默认整数应该可以工作。您可能只需要使用integer
,而不需要指定种类!使用iso_fortran_env
,INT32
就足够了。如果这不能解决您的问题,可能是您的阵列太大了。。。您可能需要向我们展示更多代码
p.p.S.对附加源代码的响应。
t
do循环从1变为total\u time
,但使用第二个索引作为t+1
,这意味着最大值将是total\u time+1
。这超过了当前的第二个维度。您有一个数组订阅错误。如果您使用下标边界进行编译,则编译器将为您找到它。使用gfortran时,可以使用-fcheck=all或-fbounds check。我很好奇,您是用哪种能力学习FORTRAN的?学术性的,纯粹的好奇心,还是与工作有关的?这是学术性的。我是阿根廷物理系的学生,我们的iso_fortran_env需要对按位类参数具有F2008风格。我尝试了这个,但不起作用。我把我所有的程序都放进去了。我给我们提供了一个非常大的数组,可能是这里的错误。我使用这个编译器:GNU FORTRAN(Ubuntu/LIANARO 4.7.2-2Ubuntu1)4.7.2版权(C)2012免费软件基金会,我忘了-DILITES中的1,但这不是错误。有可能是马里克斯的问题吗?感谢此大数组可能超过进程的堆栈大小。您可能需要增加堆栈大小或使数组可分配并分配它。这通常会将其放在堆上,而不是堆栈上。在这个主题上有一些Fortran stackoverflow问题。下面是如何尝试分配方法:real,dimension(:,:),allocatable::current
。然后在活动代码中:allocate(当前(总时间,总时间))