如何在fortran 90中管理数字类型

时间:2014-02-21 01:59:00

标签: fortran fortran90 intel-fortran

我有一个问题,希望不会影响我在Fortran 90中的数值计算。

问题是我有一个声明为

的数组
Real(r8), Allocatable              :: matKBody(:)

通过我的手,初始化这样的数组,我就像

一样
allocate(matKBody(1:Nk), STAT=ierr)
If (ierr /= 0) Stop
matKBody(:) = ( 0.0_r8, 0.0_r8)

这是一种初始化复杂数组的方法。我注意到这个错误,但我很惊讶 如果我以这种方式初始化这样的数组或使用'正确'语句无关紧要:

matKBody(:) = 0.0_r8
... 
... ! Do some stuff with the array
...
Deallocate( matKBody, STAT=ierr )
If (ierr /= 0) Stop

如果我打印两个数组,它们会给我正确的初始化,即初始化 实数。

为什么fortran(或编译器)不知道这类事情? (我使用ifort进行编译)。

1 个答案:

答案 0 :(得分:1)

完整示例:

program test_convert

use, intrinsic :: ISO_FORTRAN_ENV

Real(real64), Allocatable              :: matKBody(:)

allocate (matKBody (1:10) )
matKBody(:) = ( 0.0_real64, 0.0_real64)

end program test_convert

使用gfortran编译并附带选项:-O2 -fimplicit-none -Wall -Wline-truncation -Wcharacter-truncation -Wsurprising -Waliasing -Wimplicit-interface -Wunused-parameter -fcheck=all -std=f2008 -pedantic -fbacktrace

gfortran的输出:

matKBody(:) = ( 0.0_real64, 0.0_real64)
              1
Warning: Possible change of value in conversion from COMPLEX(8) to REAL(8) at (1)

所以有些编译器会“意识到”这些事情,并会在你要求时告诉你。

正如评论中所讨论的,Fortran在分配时提供类型之间的自动转换。所以这不是错误,但gfortran至少会提供警告,以便程序员可以检查他们是否打算进行转换。您可以通过以下方式取消警告并说明您转换的意图:

matKBody(:) = real ( ( 0.0_real64, 0.0_real64), real64 )

(这只是一个例子,因为为这个特定的作业编写= 0.0_real64要简单得多。)