允许索引访问的Fortran关联语法?
有没有一种很好的方法来编写Fortran ASSOCIATE语句来实现这一点允许索引访问的Fortran关联语法?,fortran,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 => ...) FOR
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
进行索引访问
很明显,我要说的是几句台词的过度使用。我有一大堆要浓缩的东西。除非我误读了,否则我认为这是不可能的。说明(第8.1.4.3节): 在“选择类型”或“关联”构造中,每个关联实体与其关联实体具有相同的等级 关联选择器 就我所见,您需要一个秩1关联实体(
V
),并且需要秩2
关联选择器(保持
v
)。如果目标是使代码更短/更好,我认为实现这一目标的最佳方法不需要关联结构:
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个大小的系数数组不变,就可以将其预初始化为
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)谢谢您的回答。除了玩预处理器游戏,还有什么标准的习惯用法来完成我想要的吗?@Rhys:我认为习惯用法应该是使用指向数组部分的指针,但我不认为这会使你的代码更容易理解、更整洁或更短,这似乎是你的目标。@Mark:我完全同意指向数组部分的指针并没有让它变得更好。谢谢各位。