Ich entwerfe einen Fortran-Code zur Lösung eines PDE-Systems.Ein gutes OOP-Design für einen Löser mit modernem Fortran
Die Art, wie es jetzt entworfen wird, ist, dass ich einen Typ Variable
habe, der mehrere Attribute hat, von denen das wichtigste das Array val
ist, das den Wert speichert.
Jetzt habe ich auch eine solver
Klasse, die Berechnungen auf einem variable
durchführen würde. Ich dachte, dass die ganze variable
an den Löser und arbeiten mit variable%val
jedes Mal, wenn ich es (mehrere tausend Mal während einer Ausführung) ausführen würde ineffizient sein würde, so entschied ich Zeiger Felder in der solver
Klasse zu definieren, um die zu binden Löser auf die entsprechende Variable. Zum Beispiel
program example
use variable
use solvers
type(Variable) T
type(Solver) solver_temperature
!Contructors
call T%create()
call solver_temperature%create(T)
call solver_temperature%solve()
end program example
und die Lösungs-Modul
module solvers
type Solver
real*8, pointer :: T(:,:)
contains
procedure :: create
procedure :: solve
end type
contains
subroutine create(this,T)
type(Solver) :: this
type(Variable) :: T
this%T => T%val
end subroutine
end module
In meinem Programm definiere ich andere Variable für unterschiedliche physikalische Eigenschaften und verschiedenen Solvern, die mit diesen Variablen in der Art und Weise verbunden sind, die ich oben zeigte.
Ich bin neu bei OOP im Allgemeinen, also meine Frage ist, ob das ein anständiges Design ist? Vor allem aus der Sicht der Leistung. Wie vergleicht man das mit T
nur ein Array und übergibt es an ein Unterprogramm solve
in Bezug auf die Geschwindigkeit? Gibt es einen normalen Weg dies zu tun?
Ich sehe nicht viel Punkt im Variablenzeiger. Es einfach als Dummy-Argument zu übergeben, erscheint mir natürlicher. Es ist nur ein Array-Deskriptor, nichts schlechtes für die Leistung. –