将Fortran 77转换为Fortran 95

时间:2014-03-02 11:41:39

标签: arrays fortran fortran90 fortran77 fortran95

我在这里得到了一段代码,我似乎无法找到将这段代码转换为Fortran 95等效代码的有效方法。我已经尝试了好几件事,但我总是坚持用矩阵制作一维数组,反之亦然(重点是减少计算时间,如果我转换它们,我想不出另一种方法,而不是使用循环再次:/)。

这是一段代码:

do i=1,dim
do j=1,dim
    Snorm(i,j)=Sval(j)/Sval(i)
    Bnorm(i,j)=Bval(j)/Bval(i)
    Pnorm(i,j)=Pval(j)/Pval(i)
enddo
enddo

你会如何在Fortran95代码中编写它?

R中矩阵计算的等价物如下:

Snorm <- t(Sval %*% t(1/Sval))
Bnorm <- t(Bval %*% t(1/Bval))
Pnorm <- t(Pval %*% t(1/Pval))

Python中的等价物是这样的:

Snorm = (numpy.dot((Svalmat.T),(1/Svalmat))).T
Bnorm = (numpy.dot((Bvalmat.T),(1/Bvalmat))).T
Pnorm = (numpy.dot((Pvalmat.T),(1/Pvalmat))).T

with Svalmat etc the equivalent of Sval, but then columnmatrix 

有人有想法吗?

1 个答案:

答案 0 :(得分:5)

我认为不值得改变。它是有效的Fortran 95.特别是如果你的目标是计算时间。任何带有子阵列的“聪明”技巧都可以引入阵列临时数据。

显而易见的尝试是foralldo concurrent

forall(i=1:dim, j=1:dim)
    Snorm(i,j)=Sval(j)/Sval(i)
    Bnorm(i,j)=Bval(j)/Bval(i)
    Pnorm(i,j)=Pval(j)/Pval(i)
end forall

do concurrent相同。

请注意,循环的原始顺序可能效率不高。