Преобразовать Фортран 77 в Фортран 95

У меня есть фрагмент кода, и я не могу найти эффективный способ преобразования этого фрагмента кода в эквивалент Fortran 95. Я уже пробовал несколько вещей, но я всегда зацикливаюсь на создании 1D-массивов из матриц и наоборот (дело в том, чтобы сократить время расчета, и если я их конвертирую, я не могу придумать другого способа, чем использовать циклы очередной раз :/).

Это кусок кода:

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 

У кого-нибудь есть идея?


person user3365108    schedule 02.03.2014    source источник


Ответы (1)


Менять на мой взгляд не стоит. Это действительно Fortran 95. Особенно, если ваша цель - время расчета. Любые «умные» трюки с подмассивами могут привести к появлению временных массивов.

Очевидная попытка - forall или do 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.

Обратите внимание, что ваш первоначальный порядок циклов, вероятно, неэффективен.

person Vladimir F    schedule 02.03.2014
comment
Спасибо чувак! Это уже более эффективно (за счет изменения порядка циклов). - person user3365108; 02.03.2014