所有类实例的全局操作

时间:2014-07-29 15:34:28

标签: oop fortran

有一个问题:在我的CFD代码中有很多字段被实例化,我想要全部计算它们并将它们的内容写入外部文件(例如,以保存我的计算进度)。我的字段派生类型只有一个组件:

    type scalar_field 
        real , dimension (:,:,:) , allocatable :: nodes
    contains
        ! some procedures
    end type

我正在尝试使用计数器和指向所有字段的节点组件的指针创建另一个类型。像这样:

    type field_counter
        private
        real ,pointer :: scalar_fields(:,:,:,:)
        integer :: number_of_scalars
    contains
        procedure set_num_scalar_fields
        procedure set_scalar_field_pointer
        procedure output_scalars
    end type 

主要思想是将此类型的对象传递给字段构造函数,其中num_scalar_field属性递增,指针数组scalar_fields(i,:,:,:)的片与nodes数组相关联。之后,我将能够通过调用scalar_fields指针数组打印标量字段的所有内容。

但我不知道它是否有用以及是否是执行此任务的最简单方法,我必须为每个target添加nodes属性数组,这看起来有点压倒性。也许这个任务有一些OOP设计模式,或者是否有人已经解决了这类问题?

1 个答案:

答案 0 :(得分:1)

正如你所说,如果在程序初始化之后字段数是静态的,我倾向于创建它们的数组,如下所示:

type(scalar_field), dimension(:), allocatable :: all_fields

一旦你的程序启动并计算出要分配的字段数,那么它可以继续并分配它们

allocate(all_fields(num))

并且您可以像引用任何其他数组元素一样引用各个字段,如下所示:

all_fields(1)

我不认为需要为标量字段数组提供新的用户定义类型,也不需要任何指针或任何指针。请注意,我不确定在这里是否需要任何OO,在我刚刚将all_fields定义为rank-4数组并将最后一个索引用作字段的标识符。