Я разрабатываю код Fortran для решения системы PDE.Хороший дизайн ООП для решателя с современным Fortran
Способ, которым он разработан прямо сейчас, заключается в том, что у меня есть тип Variable
, который имеет несколько атрибутов, наиболее важным из которых является массив val
, который сохраняет значение.
Теперь у меня также есть класс solver
, который будет выполнять вычисления на variable
. Я решил, что передача целого variable
решателю и работа с variable%val
каждый раз, когда я захочу его запустить (несколько тысяч раз во время exectution), будет неэффективной, поэтому я решил определить поля указателя в классе solver
, чтобы связать решатель к соответствующей переменной. Например
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
И модуль решателя
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
В моей программе я определяю другую переменную для различных физических свойств и различных решателей, которые связаны с этими переменными, как я показал выше.
Я новичок в ООП вообще, так что мой вопрос в том, что это достойный дизайн? Особенно с точки зрения производительности. Как это соотносится с тем, чтобы сделать T
просто массивом и передать его подпрограмме solve
с точки зрения скорости? Есть ли регулярный способ сделать это?
Я не вижу много смысла в указателе переменной. Просто передать его, как фиктивный аргумент, кажется мне более естественным. Это только один дескриптор массива, ничего плохого для производительности. –