Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Fortran语言的上限_Fortran - Fatal编程技术网

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,

我是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, 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(当前(总时间,总时间))