Fortran中派生类型的未定义组件

时间:2014-11-11 18:47:05

标签: fortran fortran90

这更像是一个软件设计问题,而不是技术问题。

我计划使用派生类型来定义原子配置。这些可能具有许多属性,但并非所有类型的配置都会定义它们。

这是我目前的定义:

type config
  double precision                            :: potential_energy
  double precision                            :: free_energy
  double precision, dimension(:), allocatable :: coords
  integer                                     :: config_type
end type config

因此,在这个例子中,我们可能会或可能不会定义自由能(因为它的计算成本很高)。仍然使用这种衍生类型是否安全,这可能是我能想到的合理案例的超集?我应该设置某种默认值,这意味着未定义(如Python None或空指针)?

我知道扩展F2003功能,但我无法保证所有编译器都符合F2003标准。还有另一种更好的方法吗?

2 个答案:

答案 0 :(得分:2)

现在Fortran理解可分配标量的概念。像这样:

type config
  double precision                            :: potential_energy
  double precision, allocatable               :: free_energy
  double precision, dimension(:), allocatable :: coords
  integer                                     :: config_type
end type config

但是,如果您不能依赖Fortran 2003编译器,则无法使用。但是这样的编译器(或者更确切地说版本)确实变得非常稀缺。

但是要全力以赴,放弃double precision支持real(real64)或其他21世纪指定实数的方式。使用预定义和标准常量real64需要在范围单元中包含use iso_fortran_env

答案 1 :(得分:2)

正式地,禁止在其中一个组件未定义时需要整个对象值的操作(参见F2008标准的16.6.1p4)。

实际上,您可能不会遇到问题,但可以肯定的是,当执行需要派生类型对象的整个值的操作时,具有适当调试支持的编译器可能会标记组件的未定义属性。

高性能Mark的建议是一种解决方法,因为派生类型标量仍然具有“整体”值,即使其未分配其可分配组件之一(参见4.5.8)。如果组件在内存使用方面很重或类似,则此建议可能很有用。

但是单个双精度组件并不是特别重 - 根据平台,可分配标量组件的描述符可能具有相似的大小。更简单的解决方法是只给组件一个任意值。你甚至可以使用默认初始化来做到这一点。

(据推测,您有一些独立的方式来指示该组件是否包含有用的值。)