Projektuję kod Fortrana do rozwiązania systemu PDE.Dobry projekt OOP dla solvera z nowoczesnym Fortranem
Sposób, w jaki został zaprojektowany, polega na tym, że mam typ Variable
, który ma kilka atrybutów, z których najważniejszą jest tablica val
, która przechowuje wartość.
Teraz mam również klasę solver
, która wykonuje obliczenia na variable
. Pomyślałem, że przekazanie całego variable
do solver i pracy z variable%val
za każdym razem, gdy chcę go uruchomić (kilka tysięcy razy podczas egzekucji) byłoby nieefektywne, więc zdecydowałem się zdefiniować pola wskaźnika w klasie solver
, aby powiązać z solver do odpowiedniej zmiennej. Na przykład
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
i moduł Solver
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
W moim programie zdefiniować inną zmienną o różnych właściwościach fizycznych i różnych rozwiązują, które są związane z tymi zmiennymi w sposób pokazałem powyżej.
Jestem nowy w OOP w ogóle, więc moje pytanie brzmi, czy to przyzwoity projekt? Zwłaszcza z punktu widzenia wydajności. Jak to się ma do robienia z tablicą T
i przekazywanie jej do podprogramu solve
pod względem szybkości? Czy jest jakiś regularny sposób na zrobienie tego?
Nie widzę wiele punktów w zmiennej wskaźnik. Samo przekazanie go jako fałszywej argumentacji wydaje mi się bardziej naturalne. Jest to tylko jeden deskryptor tablicy, nic złego dla wydajności. –