如何在fortran函数中输出2个或更多数组?

时间:2016-09-12 08:38:18

标签: matrix fortran numerical-computing matrix-decomposition

我正在编写一个程序来计算矩阵的LU分解,并进行部分旋转,我希望该函数能够输出几个(2或3)矩阵,而无需多次运行程序来单独输出每个矩阵,这是浪费时间,因为它在一次运行中得到了我想要的一切。有办法做到这一点吗?例如,这是我使用Doolittle算法的函数,对于不需要旋转的方矩阵。我希望我的输出立即成为矩阵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 个答案:

答案 0 :(得分:1)

您可以从使用功能切换到使用子程序。这样,您可以在参数列表中输出多个数组的值。另外使用 在子例程中声明变量时的INTENT定义,例如:

REAL,INTENT(IN)::a声明a并且不允许在子例程/函数内更改其值

REAL,INTENT(OUT)::b声明b并忽略它进入子程序/函数的任何值

REAL,INTENT(INOUT)::c默认情况下是这种情况,如果你不写任何东西。

我假设您需要输出为lu(而非m),在这种情况下,结构看起来类似于下面的结果。请注意,lm应该在主程序中声明,并且它们的大小是根据aa定义的(如下面第一种情况所示)或用{{1}声明主程序中的大小,传递给子程序而不在子程序中分配和分配(第二个例子)。后者可能要求您将子例程放在模块中,以便正确处理接口。

第一个例子:

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