0

Я пишу программу, которая вычисляет LU-декомпозицию матрицы с частичным поворотом, и я хотел бы, чтобы функция выводила несколько (2 или 3) матрицы без запуска программы несколько раз для вывода каждого из них по отдельности, что является пустая трата времени, так как она получает меня все, что я хочу за один проход. Есть ли способ сделать это? Например, вот моя функция, использующая алгоритм Дулиттла, для квадратной матрицы, которая не требует поворота. Я хочу, чтобы мой вывод был матрицей l и u сразу, но я не знаю, как это сделать.Как вывести 2 или более массивов в функцию fortran?

function lu_d(aa) result(l) 

real, dimension (:,:) :: aa !input matrix 
real, dimension (size(aa,1), size(aa,2)) :: a !keeping input variable intact 
real, dimension (size(a,1), size(a,2)) :: l , u !lower and upper matrices 
integer :: i,j,k !index 
real :: s !auxiliar variable 

a=aa 

do j=1 , size(a,2) 
    u(1,j)=a(1,j) 
end do 

l(1,1)=1 

do j=2, size(a,2) 
    l(1,j)=0 
end do 

do i=2, size(a,1) 

    l(i,1)=a(i,1)/u(1,1) 
    u(i,1)=0 

    do j=2, i-1 

    s=0 
    u(i,j)=0 

    do k=1, j-1 
     s=s+l(i,k)*u(k,j) 
    end do 

    l(i,j)=(a(i,j)-s)/u(j,j) 

    end do 

    l(i,i)=1 

    do j=i, size(a,2) 

    s=0 
    l(i,j)=0 

    do k=1, i-1 
     s=s+l(i,k)*u(k,j) 
    end do 

    u(i,j)=a(i,j)-s 

    end do 

end do 

end function 
+0

Всегда используйте тег [тег: Фортран]. Добавьте определенную версию, если необходимо, чтобы ее отличить. Только очень небольшое количество людей следуют за [tag: fortran95]. –

+0

Конечно, есть способ сделать такие вещи, но вы должны показать свое усилие. Как выглядит ваш код? Какие проблемы вы нашли? –

+0

Я искал некоторую информацию в Интернете, но я ничего не нашел об этом. Я отредактирую сообщение и добавлю свой код! Момент. –

ответ

1

Вы можете перейти от использования функции к подпрограмме. Таким образом вы можете выводить значения для нескольких массивов в списке аргументов. Кроме того, используя INTENT определение при объявлении переменных в подпрограмме, например:

REAL,INTENT(IN)::a объявляет и не допускает его значения должны быть изменены внутри подпрограммы/функции

REAL,INTENT(OUT)::b объявляет б и не принимает во внимание любые значения, оно ближайшие в подпрограмму/функцию

REAL,INTENT(INOUT)::c это по умолчанию, если вы ничего не пишете.

Предполагаю, что вам нужны выходные данные l и u (а не m), и в этом случае структура будет выглядеть примерно так, как показано ниже. Обратите внимание, что l и m должны быть объявлены в основной программе и их размер определен по отношению к aa (как в первом случае, показанном ниже) ИЛИ объявлен с размером allocatable в основной программе, передан в подпрограмму без выделения и распределения в рамках подпрограммы (второй пример). Последнее может потребовать, чтобы вы поместили подпрограмму в модуль так, чтобы интерфейсы обрабатывались должным образом.

Первый пример:

SUBROUTINE lu_d(aa,l,m) 
implicit none 
real,intent(in):: a(:,:) 
real,intent(out):: l(:,:), m(:,:) 
integer:: i,j,k 
real:: s 

<operations> 

RETURN 
END SUBROUTINE lud_d 

Второй пример:

SUBROUTINE lu_d(aa,l,m) 
implicit none 
real,intent(in):: a(:,:) 
real,allocatable,intent(out):: l(:,:), m(:,:) 
integer:: i,j,k,size_a1,size_a2 
real:: s 

size_a1=size(aa,1) 
size_a2=size(aa,2) 
allocate(l(size_a1,size_a2), m(size_a1,size_a2)) 

<operations> 

RETURN 
END SUBROUTINE lud_d 
+0

Спасибо всем ^^ –

+0

Удивительно, но я не делаю этого ... Но может ли функция вернуть структуру? Если это так, то он может вернуть структуру с двумя массивами, но подпрограмма кажется более простой ... Вероятно, поэтому я так делаю. – Holmz

+0

Это справедливо, технически вы также можете выводить матрицу, которая содержит 'l' и' m' с функциональным подходом, но тогда вам придется отделять их потом. Объявление результата функции, например. 'A (размер (aa, 1), размер (aa, 2), 2)', а затем имеет значение A (:,:, 1) = l; A (:,:, 2) = m' должен делать это, но вы можете видеть неудобства. – ptev

Смежные вопросы