Estoy diseñando un código Fortran para resolver un sistema PDE.Un buen diseño OOP para un solucionador con Fortran moderno
La forma en que está diseñado ahora es que tengo un tipo Variable
que tiene varios atributos, el más importante de los cuales es la matriz val
que almacena el valor.
Ahora también tengo una clase solver
, que realizaría cálculos en un variable
. Pensé que pasar el variable
completo al solucionador y trabajar con variable%val
cada vez que quisiera ejecutarlo (varios miles de veces durante una ejecución) sería ineficiente, así que decidí definir campos de puntero en la clase solver
para enlazar el solucionador a la variable apropiada. Por ejemplo
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
y el módulo solucionador
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
En mi programa defino diferentes variables para diferentes propiedades físicas y diferentes solucionadores que están asociados con esas variables en la forma en que he mostrado antes.
Soy nuevo en OOP en general, entonces mi pregunta es si ese es un diseño decente. Especialmente desde el punto de vista del rendimiento. ¿Cómo se compara esto con hacer T
solo una matriz y pasarla a una subrutina solve
en términos de velocidad? ¿Hay alguna forma regular de hacer esto?
No veo mucho sentido en el puntero de la variable. Simplemente pasarlo como un argumento falso me parece más natural. Es solo un descriptor de matriz, nada malo para el rendimiento. –