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)
你认为"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
因为常量不同,第一个在赋值之前转换为单精度.