是否可以在Fortran中将矩阵声明为派生类型?

时间:2016-03-27 23:52:07

标签: oop fortran fortran2003 derived-types

是否可以在Fortran中将矩阵声明为派生类型?例如,可以执行某些操作以便调用

class(four_by_four_matrix) :: A

call A%inv 

有效吗?将inv声明为four_by_four_matrix

的过程的位置

2 个答案:

答案 0 :(得分:4)

问题的答案“有可能吗?”是的,这是可能的。只需在您的类型中添加一个2d数组:

  type four_by_four_matrix
    real(rp) :: arr(4,4)
  contains
    procedure :: inv => four_by_four_matrix_inv
  end type

contains

  subroutine four_by_four_matrix_inv(self)
    class(four_by_four_matrix), intent(inout) :: self
    ....
    !somehow invert self%arr
  end subroutine

end module

...

type(four_by_four_matrix) :: A

call A%inv

如果您需要更多详细信息,则必须对实际的详细问题提出疑问。

在Fortran 2003中引入了BTW类型绑定过程和class关键字。请注意,您不一定需要使用class,如果您的变量是{1}},也可以使用type(four_by_four_matrix)不是多态的。

答案 1 :(得分:3)

Vladimir F使用Fortran 2003中引入的类型绑定过程给an approach,并对class的多态声明进行评论。

如果问题所示,答案假设您有一个四乘四的矩阵,或者至少在编译时已知的大小。在更广泛的使用中,人们可能想要概括。有价值的是将组件数组分配(确保它以某种方式分配,并注意到这不是Fortran 90/95)。

或者,Fortran 2003还引入了参数化派生类型的概念。这里,非常类似于字符变量中长度的概念,可以使用长度参数化的派生类型:

type square_matrix(n)
  integer, len :: n
  real matrix(n,n)
end type square_matrix

声明像

这样的变量
type(square_matrix(4)) A  ! Like type(four_by_four_matrix), perhaps
type(square_matrix(8)) B  ! Like type(eight_by_eight_matrix), perhaps

甚至可以使用此类型的延迟长度变量

type(square_matrix(:)), allocatable :: A, B
integer q
q = ... ! Something run-time, perhaps.
allocate(square_matrix(q) :: A)
B = square_matrix(q)(matrix)  ! Constructor using a matrix value

类型绑定过程使用假定长度语法对任意参数化类型起作用:

subroutine inv(sm)
  class(square_matrix(*)), intent(inout) :: sm
  ...
end subroutine inv

几乎完整的例子如下。

module matrix_mod

  implicit none

  type square_matrix(n)
    integer, len :: n
    real matrix(n,n)
   contains
    procedure inv
  end type square_matrix

contains

  subroutine inv(sm)
    class(square_matrix(*)), intent(inout) :: sm
    ! Some inv stuff, but as a placeholder
    print '("Called inv with a ",I0,"-by-",I0," matrix")', sm%n, sm%n
  end subroutine inv

end module matrix_mod

  use matrix_mod
  implicit none

  type(square_matrix(4)) A

! Establish A%matrix somehow, perhaps with a structure constructor
  call A%inv()

end

当然,不限于方形矩阵:可以使用多个参数。此外,我还跳过了种类参数化的可能性。