Несоответствие рангов в фортране

при выполнении этой функции:

FUNCTION gaussian_elimination(A, C) result(X)
implicit none
real, intent(inout) :: C(:), A(size(C), size(C))
real :: X(size(C))

real    :: D(size(C))
integer :: i, j, neq

neq = size(C)

! Forward reduction, only two loops since reduction is now row by row
do i = 1, neq
D = A(:,i)/A(i,i)

do j = i+1, neq
A(j,:) = A(j,:) - D(j)*A(i,:)
C(j) = C(j) - D(j)*C(i)
enddo
enddo

! Back substitution, only one loop
do i = neq, 1, -1
x(i) = (C(i) - sum(A(i, i+1:) * x(i+1:))) / A(i,i)
enddo

end FUNCTION gaussian_elimination

Со следующим:

real , DIMENSION(6,6) :: K
real , DIMENSION(6,1) :: R
real , DIMENSION(6,1) :: n
n = gaussian_elimination(K,R)

Результат:

n = gaussian_elimination(K,R)
1

Ошибка: Несовместимые ранги 2 и 1 в назначении на (1)


person bjornasm    schedule 22.10.2013    source источник


Ответы (1)


Вам нужно указать второе измерение для X, если n должно быть DIMENSION(6,1):

real :: X(size(C,1),size(C,2))

Обратите внимание, что у вас также неправильно указаны фиктивные аргументы... Вероятно, это должно выглядеть так:

FUNCTION gaussian_elimination(A, C) result(X)
implicit none
real, intent(inout) :: C(:,:), A(size(C,1), size(C,1))
real :: X(size(C,1),size(C,2))
...

В качестве альтернативы вы можете определить R и n как

real , DIMENSION(6) :: R
real , DIMENSION(6) :: n

и оставьте свой код без изменений.


Вариант третий: вы работаете со срезами массива:

n(:,1) = gaussian_elimination(K,R(:,1))

Никаких изменений в коде...

person Alexander Vogt    schedule 22.10.2013