Как вывести 2 или более массивов в функции фортрана?

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

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

1 ответ

Решение

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

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

REAL,INTENT(OUT)::b объявляет 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
Другие вопросы по тегам