Fortran:初始化并为数组赋值

Dev*_*per 4 arrays fortran assign

要在Fortran中初始化并为数组赋值,我们执行以下操作:

初始化:

real(kind=8):: r(3,4)
...
r(:,:) = 0.0_8

如果我们只使用它会怎么样

real(kind=8):: r(3,4)
...
r = 0.0_8

如果我们这样做会怎样

real(kind=8):: r(3,4)
...
r = 0

也适用于以下情况:

real(kind=8):: r(3,4), q(3,4), p(30,40)
...
q = 0
r = q
r = p(1:3,21:24)

我们更喜欢这样做:

real(kind=8):: r(3,4), q(3,4), p(30,40)
...
q = 0.0_8
r(:,:) = q(:,:)
r(:,:) = p(1:3,21:24)

我们不确定所以希望你能为我们提供一些你喜欢的理由.

max*_*max 11

关于在Fortran中有效使用数组的一般考虑(包括声明和赋值),我建议阅读本文.

为了更准确地回答你的问题,几个月前我做了一些你可能感兴趣的测试.结果如下.这是我在Linux Archlinux x86-64上的个人笔记本电脑上的测试,GNU Fortran(GCC)4.6.1 20110819(预发布)没有优化选项.

do i = 1 , 100
  do j = 1 , 100
    do k = 1 , 100 ! innest is fastest
      array ( i , j , k ) = 0.0d0
    end do
  end do
end do
! reference time : 1.00
Run Code Online (Sandbox Code Playgroud)

do i = 1 , 100
  do j = 1 , 100
    do k = 1 , 100
      array ( k , j , i ) = 0.0d0
    end do
  end do
end do
! time : 0.499
Run Code Online (Sandbox Code Playgroud)

array = 0.0d0
! time : 0.250
Run Code Online (Sandbox Code Playgroud)

array ( : , : , : ) = 0.0d0
! time : 0.250
Run Code Online (Sandbox Code Playgroud)


M. *_* B. 6

你认为"kind = 8"意味着8个字节吗?对于所有编译器来说都不是这样.使用selected_real_kind内在函数实现最大可移植性以定义类型值:

integer, parameter :: DRK = selected_real_kind (14)
Run Code Online (Sandbox Code Playgroud)

在您列出的一些选项中,我更喜欢 r = 0.0_8或更好r=0.0_DRK.这定义了整个数组.在这种情况下,不需要指定数组部分,因为您正在调用整个数组:r(:,:).史蒂夫莱昂内尔讨论了为什么试图使用":"来表明数组是不是一个好主意 - 数组数组之间存在差异(:).作为一个论点,第一个是声明维度,而第二个始终从1开始 - 请参阅http://software.intel.com/en-us/blogs/2008/03/31/doctor-it-hurts-when -i-DO-这个/

由于r是实数,r = 0意味着转换.对于零值,这几乎肯定无关紧要,但它可能与其他值有重要区别.例如,

r = 3.1415927654
Run Code Online (Sandbox Code Playgroud)

r = 3.141592654_8
Run Code Online (Sandbox Code Playgroud)

将给出不同的值,r因为常量不同,第一个在赋值之前转换为单精度.

  • 关于kind = 8不等于8字节的部分在过去已经讨论了很多.有点普遍的看法是,类型的类型不应该以整数开头.它引起了很多困惑. (2认同)