派生数据类型中的 Fortran、参数和静态表

Posted

技术标签:

【中文标题】派生数据类型中的 Fortran、参数和静态表【英文标题】:Fortran, parameters and static table inside a derived data type 【发布时间】:2013-11-17 14:19:48 【问题描述】:

我想创建一个派生数据类型,其中包含一个表和该表的长度。理想情况下,我想声明如下

type mydata
    integer                :: ndata
    real, dimension(ndata) :: x
end type mydata

但一开始 ndata 是未知的,因此 x 是一个动态表。

我必须对 x 使用allocatable 并在 ndata 已知时分配它吗?

type mydata
    integer                         :: ndata
    real, dimension(:), allocatable :: x
end type mydata

....

type(mydata) :: var
var % ndata = 10
allocate(var % x(10))

处理此类案件的最佳方法是什么?

【问题讨论】:

【参考方案1】:

解决您的问题的最佳方法是使用最新的 Fortran 2003 兼容编译器并使用参数化派生类型。如果我没记错的话,目前只有 Cray 和 IBM 编译器支持这个特性。它将允许您定义这样的类型

type mydata(sz)
    integer, len :: sz
    real, dimension(sz) :: x
end type mydata

这似乎正是您想要的。如果您没有这些编译器中的任何一个,那么临时解决方案(例如您建议的那个)将不得不暂时满足您。当然,您可以将首选的解决方法捆绑到非默认类型构造函数中。

如果您在没有参数化派生类型的情况下陷入困境,那么我将从这样的类型定义开始:

type mydata
    real, dimension(:), allocatable :: x
  contains
    procedure :: setSize
    procedure :: getSize
end type mydata

并以明显的 (?) 方式定义那些类型绑定的过程。这将防止ndatax 的大小变得不同。

【讨论】:

我对 fortran 中的 OOP 不是很熟悉,我不明白你所说的“非默认类型构造函数”。您是指填充结构的简单子程序吗?但是,您的最后一个示例很优雅。绑定ndatax 的长度是个好主意,但是我应该如何定义这些过程?它们只是与结构相同的模块中的标准子程序吗? 看来您很有动力去学习更多 Fortran 的 OOP 特性。 Metcalf、Reid 和 Cohen 的书有很好的覆盖面,如果简洁的话。类型(或结构)构造函数(默认和非默认)共享类型的名称,例如object = mydata(2,[0.3,0.4]);您需要定义一个名为mydata 的接口和实现该接口的例程。定义 getSizesetSize 就像您定义任何其他过程一样,但要调查 pass 绑定属性。当您遇到困难时,请提出更多问题。

以上是关于派生数据类型中的 Fortran、参数和静态表的主要内容,如果未能解决你的问题,请参考以下文章

将常量命名为派生数据类型的组件

在 Fortran 中多次循环后访问派生数据类型

确定内存中的 Fortran 派生类型大小

mpifort -DMPI 编译错误:派生类型“mpi_status”用作实际参数。适用于英特尔 Fortran,但不适用于 GNU Fortran

在 fortran 中命名派生类型的良好做法

Fortran中的“%”是什么意思/做什么?