主题:求教FORTRAN子程序能否像数组一样循环
heizaoniangao
[专家分:310] 发布于 2011-07-09 11:51:00
对于数组循环有FORALL和WHERE之类的函数
想问一下如何实现子程序类似的功能呢?
例如
REAL(8), DIMENSION(2) :: A
REAL(8), DIMENSION(3) :: B
REAL(8), DIMENSION(2,3) :: C
!ADD是一个子程序
EXTERNAL :: ADD
!用类似数组的函数实现循环调用子程序
FORALL(I=1:2,J=1:3) CALL ADD(A(I),B(J),C(I,J))
回复列表 (共6个回复)
沙发
heizaoniangao [专家分:310] 发布于 2011-07-10 00:23:00
补充一下,就是可不可以用一行代码实现下面的语句
Do I=1,2
Do J=1,3
CALL ADD(A(I),B(J),C(I,J))
End Do
End Do
板凳
dongyuanxun [专家分:7180] 发布于 2011-07-10 01:50:00
Take a try, and you'll see.
3 楼
heizaoniangao [专家分:310] 发布于 2011-07-10 04:40:00
不行啊,我编了一下,程序报错。
Program FORALLCALL
REAL(8), DIMENSION(2) :: A = (/1.D0, 2.D0/)
REAL(8), DIMENSION(3) :: B = (/1.D0, 2.D0, 3.D0/)
REAL(8), DIMENSION(2,3) :: C
EXTERNAL :: ADD
FORALL(I=1:2,J=1:3) CALL ADD(A(I),B(J),C(I,J))
End Program
Subroutine ADD(A, B, C)
Real(8) :: A, B, C
C = A+B
End Subroutine
4 楼
fortran2008 [专家分:750] 发布于 2011-07-17 14:35:00
楼主:Forall结构只能用来设置数组值相关的程序命令,所以出现CALL ADD(A(I),B(J),C(I,J))不允许的。
5 楼
cgl_lgs [专家分:21040] 发布于 2011-07-17 19:30:00
在FORALL中,你可以用函数,但不可以用子程序。
不过函数也仅限PURE类型的函数(ELEMENTAL应该也行的)。
6 楼
cgl_lgs [专家分:21040] 发布于 2011-07-17 19:32:00
当然,如果你的PURE函数里调用了PURE的子程序,那也是允许的:)
我来回复