fortran 2003 seg fault with overridden type-bound procedure

时间:2013-03-12 18:44:44

标签: oop override fortran

我正在尝试使用Fortran 2003的一些面向对象的功能,但我遇到了一些麻烦。首先,我有一个抽象数据类型sparse_matrix:

type, abstract :: sparse_matrix
    (some data)
contains
    procedure(matrix_vector_multiply), deferred :: matvec
end type sparse_matrix

abstract interface
    subroutine matrix_vector_multiply(A,x,y)
        import :: sparse_matrix
        class (sparse_matrix), intent(in) :: A
        real(kind=8), dimension(:) :: x,y
    end subroutine matrix_vector_multiply
end abstract interface

然后我有一个继承自sparse_matrix

的具体数据类型
type, extends(sparse_matrix) :: csr_sparse_matrix
    (some more data)
contains
    procedure :: matvec => csr_matvec
end type csr_sparse_matrix

和matvec的实际实现:

subroutine csr_matvec(A,x,y)
    class (csr_sparse_matrix), intent(in) :: A
    real(kind=8), dimension(:) :: x,y
    (do stuff)
end subroutine csr_matvec

后来,我想在不同的模块中使用matvec,我不关心我有哪种动态类型:

subroutine solve(A,x,b,tolerance)
    class (sparse_matrix), intent(in) :: A
    real(kind=8), dimension(:), intent(in) :: b
    real(kind=8), dimension(:), intent(out) :: x
    real(kind=8), intent(in) :: tolerance
    real(kind=8), dimension( A%nrow ) :: z

    call A%matvec(b,z)
    (more stuff)
end subroutine solver

我的理解是,无论动态类型A是什么,一切都应该正常工作,只要在子数据类型中重写了子例程matvec

这段代码编译得很好,但是当我运行它时会出现错误。当我在solve过程中更改矩阵的声明时,如下所示:

     class (csr_sparse_matrix), intent(in) :: A

它运作得很好。同样,如果我将A作为sparse_matrix但是使用

select type(A)
type is (csr_sparse_matrix)
    (the same stuff)
end select
然后一切都运行良好。但这首先打破了覆盖抽象类型过程的整个目的 - 程序不应该关心我正在使用什么样的矩阵,只要它可以执行矩阵向量乘法。

无论如何,我确定这只是某个属性的问题,我忘了包含,但我无法弄清楚它是什么。

1 个答案:

答案 0 :(得分:1)

毕竟这是编译器;我正在使用gfortran 4.6.3,而抽象数据类型仅在gfortran 4.7中得到适当支持。不幸的是,这使我的代码不那么便携,因为几个Linux发行版的长期支持版本只包含版本4.6。