2016-03-27 11 views

Antwort

4

Die Antwort auf die Frage "ist es möglich?" ist ja, es ist möglich. Einfach ein 2D-Array in Ihrer Art:

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 

Wenn Sie weitere Informationen benötigen, müssen Sie eine Frage mit Ihrem tatsächlichen detaillierten Probleme machen.

BTW typgebundene Prozeduren und die class Schlüsselwort wurden in Fortran 2003 Hinweis eingeführt Sie nicht unbedingt class verwenden müssen, können Sie auch type(four_by_four_matrix) verwenden können, wenn Ihre Variable nicht polymorph ist.

3

Vladimir F gibt an approach unter Verwendung von typgebundenen Prozeduren, die in Fortran 2003 eingeführt wurden, und Kommentare zur polymorphen Deklaration von class.

Diese Antwort geht davon aus, dass Sie, wie die Frage nahelegt, eine Vier-mal-vier-Matrix oder zumindest eine beim Kompilieren bekannte Größe haben. Im weiteren Gebrauch möchte man vielleicht verallgemeinern. Der Wert würde dann das Komponenten-Array zuweisbar machen (was sicherstellt, dass es irgendwie zugeordnet ist und feststellt, dass dies auch nicht Fortran 90/95 ist).

Alternativ hat Fortran 2003 auch das Konzept parametrisierte abgeleitete Typen eingeführt. Hier, ähnlich wie die Idee der Länge in einer Zeichenvariablen könnte man eine Länge-parametrisiert abgeleiteten Typ:

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

Deklarieren von Variablen wie

type(square_matrix(4)) A ! Like type(four_by_four_matrix), perhaps 
type(square_matrix(8)) B ! Like type(eight_by_eight_matrix), perhaps 

One selbst haben können latente Länge Variablen dieses Typs

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 

Die typgebundenen Verfahren wirkt auf einen beliebigen Typ parametrisierten, indem angenommen Länge Syntax:

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

Ein fast vollständiges Beispiel wäre wie folgt.

Natürlich ist man nicht auf quadratische Matrizen beschränkt: mehrere Parameter können verwendet werden. Außerdem habe ich auch die Möglichkeit der Art-Parametrisierung übersprungen.

+0

Ich habe darüber nachgedacht darüber zu schreiben, wie es für diese Verwendung ganz natürlich ist. Aber ich bin immer noch nicht bereit, dies in der Praxis zu benutzen, weil die Unterstützung von gfortran immer noch nicht in den Versionen verfügbar ist, die die meisten Leute benutzen. –

+0

Ich hatte nicht bemerkt, dass es sogar in den letzten gfortran-Versionen Unterstützung gab (aber ich behalte das nicht bei), ja, das ist eine Antwort für die Zukunft und das breitere Publikum. Es gibt einige Beispiele auf dieser Seite von PDTs, vielleicht wegen der begrenzten Unterstützung von Compilern, und dies scheint ein einfacher und natürlicher Fall zu sein. – francescalus