Заполните определенный диапазон в массиве Фортрана с подразумеваемой петлей - PullRequest
0 голосов
/ 12 сентября 2018

Я хочу заполнить массив некоторыми значениями из неявного цикла ... Моя проблема в том, что, хотя первая строка работает нормально, вторая получает ошибку от моего отладчика в редакторе 'Ожидается правильный паратез ввыражение '.

usum(:,:,:,1:3) = (usum(:,:,:,ll)+(um(ll)*ur(:,:,:,ll),ll=1,3)
usum(:,:,:,4:6) = (usum(:,:,:,ll+3)+(um(ll)*ur(:,:,:,ll))**2, ll=1,3)

Я не понимаю, почему первая строка работает, а вторая нет ...

Это фиксированный отформатированный исходный код и точная ошибкасообщение от ifort:

snapstat.f(353): error #5082: Syntax error, found '=' when expecting one of: .EQV. .NEQV. .XOR. .OR. .AND. .LT. < .LE. <= .EQ. == .NE. /= .GT. > ...         
     1                  ll=1,3)                                                                                                                              
--------------------------^                                                                                                                                                                                                                                                     
snapstat.f(355): error #5082: Syntax error, found '=' when expecting one of: .EQV. .NEQV. .XOR. .OR. .AND. .LT. < .LE. <= .EQ. == .NE. /= .GT. > ...         
     1                  ur(:,:,:,ll))**2, ll=1,3)
--------------------------------------------^
snapstat.f(353): error #5082: Syntax error, found '=' when expecting one of: .EQV. .NEQV. .XOR. .OR. .AND. .LT. < .LE. <= .EQ. == .NE. /= .GT. > ...         
     1                  ll=1,3)                                                                                                                              
--------------------------^                                                                                                                                                                                                                                                
snapstat.f(355): error #5082: Syntax error, found '=' when expecting one of: .EQV. .NEQV. .XOR. .OR. .AND. .LT. < .LE. <= .EQ. == .NE. /= .GT. > ...         
     1                  ur(:,:,:,ll))**2, ll=1,3)
--------------------------------------------^

(я разделил строку в моем редакторе, поэтому она не длиннее 72)

1 Ответ

0 голосов
/ 15 сентября 2018

Как обсуждалось в комментариях, я думаю, что подразумеваемый цикл не может быть использован непосредственно для такого рода суммирования.Например, следующий код пытается суммировать p(:,:,k) * c(k) за k = 1,4.

program main
    implicit none
    integer :: p(2,3,4), c(4), ans(2,3), k
    p = 1; c = 1

    ans(:,:) = ( p(:,:,k) + c(k), k = 1,4 )

    print *, "ans = ", ans
end

Но gfortran дает

    ans(:,:) = ( p(:,:,k) + c(k), k = 1,4 )
                                1
Error: Expected a right parenthesis in expression at (1)

, а Intel Fortran дает

test1.f90(7): error #5082: Syntax error, found '=' when expecting one of: .EQV. .NEQV. .XOR. .OR. .AND. .LT. < .LE. <= .EQ. == .NE. /= .GT. > ...
    ans(:,:) = ( p(:,:,k) + c(k), k = 1,4 )
------------------------------------^

Итак, я думаю, что лучше всего использовать явный цикл do над k=1,4.(Я пытался написать несколько строк, но они кажутся менее читабельными ...)

program main
    implicit none
    integer :: p(2,3,4), c(4), ans1(2,3), ans2(2,3), ans3(2,3), k

    !! Dummy data.
    c = [ 1, 10, 100, 1000 ]
    do k = 1, 4
        p(1,:,k) =  k
        p(2,:,k) = -k
    enddo

    ans1 = 0
    do k = 1, 4
        ans1 = ans1 + p(:,:,k) * c(k)
    enddo

    ans2 = sum( reshape( [( p(:,:,k) * c(k), k=1,4 )], shape(p) ), dim=3 )

    ans3 = sum( p * reshape( spread( c, 1, 2*3 ), shape(p) ), dim=3 )

    print *, "ans1 = ", ans1
    print *, "ans2 = ", ans2
    print *, "ans3 = ", ans3
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...