在fortran中命名派生类型的良好实践

时间:2013-04-12 10:17:44

标签: variables coding-style fortran derived-types

我想通过使用OOP来优化我在Fortran中的代码的可读性。 因此我使用派生类型。命名类型和派生类型的最佳做法是什么?

例如,最好是:

type a
    real :: var
end type
type(a) :: mya

或始终按照type_中的type_a开始输入名称?我喜欢这个,但也许更好的想法可能很多。

此外,如果类型具有太多“级别”,那么使用可读性较差或名称较长的短名称会更难以阅读,这是更好的(那么为什么)。例如,在a%b%c%d%e中,如果a,b,c,d和e是country%hospital%service%patient%name中的8个或更多字母,那么再一次可读性似乎是一个问题。

非常欢迎专家的建议。

2 个答案:

答案 0 :(得分:4)

这对Fortran来说并不特别。您可以对其他语言使用编码建议。  通常,类型名称不是由任何前缀或后缀指定的。在许多语言中,类名以大写字母开头。您也可以在Fortran中使用它,即使它不区分大小写。请确保不要使用小写字母作为变量名重用该名称。

良好编码指南的一个示例是this,您可以非常轻松地为Fortran进行调整。另外,请查看MRCRXX等书籍中的一些Fortran示例。 OS也很有用。

如果字母与书面等式中使用的字母不同,我建议不要使用太短的组件名称。在这种情况下,它可以使用。

使用associate构造或指针为嵌套名称(如country%hospital%service%patient%name)创建别名。

答案 1 :(得分:2)

根据我的经验,OO Fortran中的命名问题比其他语言(例如C ++)更多,因为Fortran的命名模块,缺少命名空间和不区分大小写等等。不区分大小写会造成伤害,因为如果您将类型命名为Foo,则不能使用名为foo的变量,否则将出现编译器错误(使用gfortran 4.9进行测试)。

我已经确定的规则是:

  • 每个Fortran模块都提供一个名为Namespace_Foo的主要类。
  • 班级Namespace_Foo可以作为Namespace/Foo_M.f90位于源树中。
  • 类变量是具有描述性小写名称的名词,如barbar_baz
  • 类方法是具有描述性(但可能很短)名称的动词,并使用重命名search => Namespace_Foo_search
  • 当没有简单的替代方法时,类Namespace_Foo的实例可以命名为foo(没有命名空间)。

这些规则使得在Fortran中镜像C / C ++类Namespace::Foo或者将C ++类绑定(使用BIND(C))到Fortran变得特别容易。它们还避免了我遇到的所有常见名称冲突。

这是一个工作示例(使用gfortran 4.9测试)。

module Namespace_Foo_M
implicit none

type :: Namespace_Foo
  integer :: bar
  real    :: bar_baz
  contains
  procedure, pass(this) :: search => Namespace_Foo_search
end type

contains

function Namespace_Foo_search(this, offset) result(index)
  class(Namespace_Foo) :: this 
  integer,intent(in)   :: offset !input
  integer              :: index  !return value
  index = this%bar + int(this%bar_baz) + offset
end function

end module

program main
use Namespace_Foo_M !src/Namespace/Foo_M.f90

type(Namespace_Foo) :: foo

foo % bar = 1
foo % bar_baz = 7.3

print *, foo % search(3) !should print 11

end program

请注意,为了运行示例,您可以将上面的所有内容复制/粘贴到单个文件中。

最后的想法

我发现在Fortran中缺少名称空间非常令人沮丧,而破解它的唯一方法就是将它包含在名称本身中。我们有一些嵌套的“命名空间”,例如在C ++ Utils::IO::PrettyPrinter和Fortran Utils_IO_PrettyPrinter中。我将CamelCase用于课程的一个原因,例如PrettyPrinter而不是Pretty_Printer,是消除名称空间的歧义。如果名称空间大写或小写,对我来说并不重要,但在名称和文件路径中应使用相同的大小写,例如课程utils_io_PrettyPrinter应该住在utils/io/PrettyPrinter_M.f90。在大型/不熟悉的项目中,您将花费大量时间在源树中搜索特定模块所在的位置,并且在模块名称和文件路径之间开发约定可以节省大量时间。