有一个问题:在我的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设计模式,或者是否有人已经解决了这类问题?
答案 0 :(得分:1)
正如你所说,如果在程序初始化之后字段数是静态的,我倾向于创建它们的数组,如下所示:
type(scalar_field), dimension(:), allocatable :: all_fields
一旦你的程序启动并计算出要分配的字段数,那么它可以继续并分配它们
allocate(all_fields(num))
并且您可以像引用任何其他数组元素一样引用各个字段,如下所示:
all_fields(1)
我不认为需要为标量字段数组提供新的用户定义类型,也不需要任何指针或任何指针。请注意,我不确定在这里是否需要任何OO,在我刚刚将all_fields
定义为rank-4数组并将最后一个索引用作字段的标识符。