【问题标题】:Fortran: initializing of and assigning value to arraysFortran:初始化数组并为其赋值
【发布时间】:2012-02-08 10:30:30
【问题描述】:

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

正在初始化:

真实(种类=8)::r(3,4) ... r(:,:) = 0.0_8

如果我们只使用会怎样

真实(种类=8)::r(3,4) ... r = 0.0_8

如果我们这样做:

真实(种类=8)::r(3,4) ... r = 0

也适用于以下情况:

真实(种类=8)::r(3,4),q(3,4),p(30,40) ... q = 0 r = q r = p(1:3,21:24)

我们更喜欢这样做:

真实(种类=8)::r(3,4),q(3,4),p(30,40) ... q = 0.0_8 r(:,:) = q(:,:) r(:,:) = p(1:3,21:24)

我们不确定,所以希望您为每个您喜欢的原因提供一些理由

【问题讨论】:

    标签: arrays fortran assign


    【解决方案1】:

    关于在 Fortran 中高效使用数组的一般注意事项(包括声明和赋值),我建议阅读 this

    如需更准确地回答您的问题,您可能会感兴趣的I did some tests some months ago。这是结果。这是我在 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
    

    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
    

    array = 0.0d0
    ! time : 0.250
    

    array ( : , : , : ) = 0.0d0
    ! time : 0.250
    

    【讨论】:

    • 嗨,Max,您的工作链接已损坏。此外,我不确定与关闭优化的比较会揭示什么。这里的内部循环将进行微不足道的优化。通常,您的示例 2、3、4 在优化模式下是相同的。
    • 我猜时间差异是由于数组存储在内存中的方式。在 Fortran 中,以二维矩阵为例,列向量是连续存储的,而不是 C++ 中的行向量。
    【解决方案2】:

    您认为“kind=8”是指 8 个字节吗?并非所有编译器都是如此。最大的可移植性是使用 selected_real_kind 内部函数来定义 kind 值:

    integer, parameter :: DRK = selected_real_kind (14)
    

    在您列出的一些选项中,我更喜欢 r = 0.0_8,或者更好的r=0.0_DRK。 这定义了整个数组。在这种情况下不需要指定数组部分,因为您调用的是整个数组:r (:, :)。 Steve Lionel 讨论了为什么尝试使用“:”使数组变得明显不是一个好主意——arrayarray (:) 之间存在差异。作为参数,第一个声明了维度,而第二个总是从 1 开始——参见http://software.intel.com/en-us/blogs/2008/03/31/doctor-it-hurts-when-i-do-this/

    由于 r 是真实的,因此 r=0 意味着转换。对于零值,这几乎肯定无关紧要,但它可能与其他值产生重要差异。例如,

    r = 3.1415927654
    

    r = 3.141592654_8
    

    会给r 赋予不同的值,因为常量不同,第一个在赋值之前被转换为单精度。

    【讨论】:

    • 关于 kind=8 不等于 8 个字节的部分过去已经讨论过很多了。人们普遍认为,种类类型不应该以整数开头。这会引起很多混乱。
    猜你喜欢
    • 1970-01-01
    • 2012-05-20
    • 1970-01-01
    • 1970-01-01
    • 2017-01-22
    • 2019-02-17
    • 1970-01-01
    • 2012-08-31
    • 2022-01-11
    相关资源
    最近更新 更多