oop - 编写健壮的 "modern"Fortran 代码

标签 oop fortran assertions scientific-computing fortran90

在某些科学环境中,通常离不开 FORTRAN,因为大多数开发人员只知道这个习语,并且有很多遗留代码和相关经验。
坦率地说,高性能编程的其他跨平台选项并不多(C++ 可以完成这项任务,但语法、零开始数组和指针与某些人不兼容)。

所以,让我们假设一个新项目必须使用 Fortran 90,但我想用它构建最现代的软件架构,同时与最新的编译器兼容(英特尔 ifort,但也包括 Sun/HP/IBM 编译器)

所以我想强加一些众所周知的常识,但在我的环境中还不是标准:

  • 禁止全局变量,没有 goto,没有跳转标签,implicit none
  • “面向对象编程”(具有数据类型和相关子例程的模块)
  • 模块化/可重用功能、文档齐全、可重用的库
  • 断言/前提条件/不变量(使用预处理器语句实现)
  • 所有(大多数)子程序和“对象”的单元测试
  • 强烈的“ Debug模式”( #ifdef DEBUG )具有更多检查和所有可能的英特尔编译器检查(数组边界、子例程接口(interface)等)
  • 统一和强制清晰的编码风格,使用代码处理工具助手。

  • 所有这些的目标是拥有值得信赖、可维护和模块化的代码。然而,在许多遗留代码中,可重用性并不是一个重要的目标。

    我搜索了有关面向对象的 Fortran、按契约(Contract)编程(断言/前提条件/等)的引用资料,发现只有丑陋和过时的文档、没有大型项目参与的人完成的语法和论文,以及死项目.

    关于这个主题的任何好的 URL、建议、引用文件/书籍?

    最佳答案

    我的5美分。

    Fortran Wiki是一个很好的起点。它有关于使用现代 Fortran 编程的不同方面的文章。单元测试、调试、泛型编程等等。也很有趣table关于 Fortran 2003 标准的编译器支持可用。 (正如 Blklight 已经提到的,某些 2003 功能在编译器中不可用。这是比较不同编译器的好地方。)

    I'm a C++ guy but I'm stuck with some F90 projects.



    我推荐阅读这门类(class):Introduction to Modern Fortran . M. S. B. 提到了著名的“Fortran 95/2003 Explained”,但这本书足够大而且细节丰富。相反,上面提到的类(class)是一个很好的起点。也看看An Interactive Fortran 90 Programming Course来自利物浦大学。

    Mistakes in Fortran 90 Programs That Might Surprise You .这个页面标题不言自明。 =)

    嗯...我的书签中还有一些指向 PSTI RESEARCH LECTURE SERIES "SCIENTIFIC COMPUTING WITH FORTRAN 95" 的链接.试一试。

    J.F. Sebastian 提到了 F2Py 并给出了教授 Python 的建议。我同意他的意见。 Python 不是我最喜欢的语言。但它足以教它有用。除了已经提到的预处理器(其中许多是用 Python 编写的)和 F2Py 之外 SCons - 现代软件构建工具。

    附言上周我在 lulu.com 买了一本电子书。 Scientific Software Development in Fortran德鲁·麦考马克。我希望它是好的阅读,但突然没有时间。作者是 Forpedo(Fortran Wiki 中提到的 Fortran 特定预处理器之一)的开发者,也是许多关于 Objective-C 和 Python 编程的书籍和教程的作者。

    关于oop - 编写健壮的 "modern"Fortran 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2758635/

    相关文章:

    Try 中的 Java 断言与多个 catch

    oop - 可从同一类的其他实例访问的私有(private)成员

    java - 如何以编程方式检索方法的参数

    fortran - 为ifort输出着色

    快速计算R中的二重积分

    ruby - 如何让assert_raise处理异常子类

    c# - 一个对象能够将自己保存到数据库中是否会破坏类的凝聚力?

    c++ - 好友功能的可访问性

    Fortran:0.d0 总是 == 0 吗?

    java - Eclipse 中断言的奇怪行为