Fortran ASSOCIATE语法允许索引访问?

时间:2010-06-09 18:24:31

标签: fortran

有没有一种很好的方法可以编写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等人的 The Fortran 2003手册第8.2节,但我看不出如何编写associate-name => selector构造以允许对{{{{{{ 1}}。

显然,我想要的是几行过度。我有一堆我想要浓缩的。

2 个答案:

答案 0 :(得分:2)

除非我误读事情,否则我认为这是不可能的。 specification说(第8.1.4.3节):

  

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

据我所见,你想要一个1级关联实体(V),需要等级2 关联选择器(用于保存v)。

答案 1 :(得分:0)

如果目的是使代码更短/更细,我认为实现这一目标的最佳方法不需要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