Fortran ASSOCIATE 语法允许索引访问吗?
有没有一种很好的方法来编写 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 Handbook 第 8.2 节,但我不知道如何编写关联名称 =>选择器 构造以允许对associate-name
进行索引访问。
显然,我想要的几行内容是多余的。我有一堆我想浓缩的东西。
Is there a nice way to write a Fortran ASSOCIATE statement to turn this
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
into something like the following
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
I'm staring at Adams et al's The Fortran 2003 Handbook section 8.2, but I can't see how to write the associate-name => selector
construct to allow for indexed access into the associate-name
.
Obviously what I'm going for is overkill for a couple of lines. I've got a bunch of 'em that I'd like to condense.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
除非我误读了事情,否则我认为这是不可能的。 规范说(第 8.1.4.3 节):
据我所知,您需要一个 1 级关联实体 (
V
),并且需要一个 2 级关联实体关联的选择器(用于保存
v
)。Unless I'm misreading things, I don't think this is possible. The specification says (section 8.1.4.3):
and as far as I can see, you want a rank 1 associating entity (
V
) and will need a rank 2associated selector (to hold
v
).如果目标是使代码更短/更好,我认为实现这一目标的最佳方法不需要
ASSOCIATE
构造:只要 5 大小的系数数组不改变,就可以预初始化为 a
然后在单行中运行,
注意它必须是
lbound(u,2)<=0
。If the aim is to make the code shorter/nicer, I think the best way to achieve that does not need an
ASSOCIATE
construct:which, as long as the 5-sized coefficient array does not change, could be preinitialized as a
And then run in a single line as
note that it must be
lbound(u,2)<=0
.