有没有一种很好的方法可以编写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}}。
显然,我想要的是几行过度。我有一堆我想要浓缩的。
答案 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
。