【问题标题】:Fortran ASSOCIATE syntax to allow indexed access?Fortran ASSOCIATE 语法允许索引访问?
【发布时间】:2020-08-22 00:12:55
【问题描述】:

有没有写 Fortran ASSOCIATE 语句的好方法来转这个

FORALL (i = 2:n-2)
    v(:,i) = v(:,i) + MATMUL(A, &
             c(2)*u(:,i-2) + c(1)*u(:,i-1) + c(0)*u(:,i) + c(1)*u(:,i+1) + c(2)*u(:,i+2))
END FORALL

变成如下内容

ASSOCIATE ( U => ..., V => ...)
    FORALL (i = 2:n-2)
        V(i) = V(i) + MATMUL(A, &
               c(2)*U(i-2) + c(1)*U(i-1) + c(0)*U(i) + c(1)*U(i+1) + c(2)*U(i+2))
    END FORALL
END ASSOCIATE

我正在看 Adams 等人的 Fortran 2003 手册 8.2 节,但我不知道如何编写 associate-name => selector 构造以允许对 associate-name 进行索引访问。

很明显,我想要写几行字就过分了。我有一堆我想压缩的。

【问题讨论】:

    标签: fortran


    【解决方案1】:

    除非我读错了东西,否则我认为这是不可能的。 specification 说(第 8.1.4.3 节):

    在 SELECT TYPE 或 ASSOCIATE 构造中,每个关联实体具有与其相同的等级 关联的选择器。

    据我所知,您需要 1 级关联实体 (V) 并且需要 2 级 关联的选择器(保存v)。

    【讨论】:

    • 感谢安德鲁的回答。没有玩预处理器游戏,有什么标准的成语来完成我所追求的吗?
    • @Rhys:我认为习惯用法是使用指向数组部分的指针,但我认为这不会使您的代码更易于理解或更简洁或更短,这似乎是你的目标。
    • @Mark:我完全同意指向数组部分的指针并没有让它变得更好。谢谢各位。
    【解决方案2】:

    如果目标是使代码更短/更好,我认为实现这一目标的最佳方法不需要ASSOCIATE 构造:

    forall(i=2:n-2)
      v(:,i) = v(:,i) + MATMUL(A,MATMUL(u(:,i-2:i+2),c([2,1,0,1,2]))
    end forall
    

    只要5大小的系数数组不变,就可以预初始化为a

    real :: c5(5)
    c5 = c([2,1,0,1,2])
    

    然后在一行中运行

    forall(i=2:n-2) v(:,i) = v(:,i) + MATMUL(A,MATMUL(u(:,i-2:i+2),c5))
    

    注意必须是lbound(u,2)<=0

    【讨论】:

      猜你喜欢
      • 2017-06-20
      • 2012-09-26
      • 2022-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-13
      • 2020-04-24
      • 1970-01-01
      相关资源
      最近更新 更多