English 中文(简体)
为现代堡堡的求解器设计好的 OOP 设计
原标题:A good OOP design for a solver with modern Fortran

我正在设计一个福特兰代码 解决PDE系统。

它现在的设计方式是,我有一个类型 Variable ,它有几个属性,其中最重要的属性是存储该值的数组 val

现在,我还有一个 solver 类,它将对 变量 进行计算。 我设想,每次我想运行整个 变量 将整个 变量 转到解决问题者, 并使用 变量% val 来操作, 效率都很低( 输出过程中有几千次), 因此我决定定义 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

在我的程序里,我定义了不同的变量 不同的物理属性 和不同的解决方案 与这些变量有关

我对 OOP 来说是新鲜的, 所以我的问题是, 如果这是一个体面的设计呢? 特别是从性能角度来说。 这和制作 < code> T 只是一个阵列, 并将其传递给一个子常规 < code> 溶解 的速度相比如何? 是否有常规方法可以这样做?

最佳回答

我与福特兰的OO功能合作了一年左右,

如果你只是关心原执行速度,那么你一般(根据辩论和我的经验和我的经验,而不是数据)可能更能避开业务厅的特征;但在许多情况下,可以提出同样的论据,即你最好避免在FORTRAN77之后添加任何文字。

赞成OO的论据在以代码设计、可理解性、可扩展性、诸如此类的问题为基础时更有力。如果这些对你来说很重要,那么你应该考虑使用OO的功能。

正如弗拉基米尔已经说过的,使用变量指示器似乎没有多大意义。 不要忘记,大多数堡堡执行都专门进行逐次查询,以避免复制(大量)数据的努力。

个人而言,我不喜欢您定义您类型约束程序 create 的方式。 我更喜欢将这种操作作为一种函数来实施, 这样我就可以写这样的行:

t = solver%new()

而不是你的

call T%create()

请注意,这是我的偏好,这更多地是一个风格问题,而不是效率或正确性问题。我注意到,您没有向子例程 < code > 创建 宣布争论的意图;也许因为您只张贴了代码的片段。

由于OO相对而言对Fortran来说比较新(而且可以说,对大多数在广泛使用Fortran的领域工作的人来说相对陌生),没有多少有用的材料可以指导我们采用它。我建议