Конвертировать Фортран 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 

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

1 ответ

Решение

Это не стоит менять на мой взгляд. Это действительно Фортран 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,

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

Другие вопросы по тегам