移植旧的fortran程序以使用python+;努比

移植旧的fortran程序以使用python+;努比,python,numpy,fortran,fortran90,f2py,Python,Numpy,Fortran,Fortran90,F2py,我应该用这个庞大的Fortran 77程序进行研究(我最近表面上移植到Fortran 90)。这是一个非常古老的软件,用于使用有限元方法进行建模 这是一个怪物。大约有24万行 自从它在Fortran 77中开始使用以来,它使用了一些非常肮脏的黑客来进行动态内存分配;基本上,它使用C标准库中的函数,与C和Fortran混合编程。我还没有完全掌握分配的工作原理。该程序易于用户扩展,用户通常需要分配一些全局可访问的阵列供以后使用。这是通过使用一个内存地址数组来实现的,该数组指向动态可分配数组的起始地

我应该用这个庞大的Fortran 77程序进行研究(我最近表面上移植到Fortran 90)。这是一个非常古老的软件,用于使用有限元方法进行建模

  • 这是一个怪物。大约有24万行
  • 自从它在Fortran 77中开始使用以来,它使用了一些非常肮脏的黑客来进行动态内存分配;基本上,它使用C标准库中的函数,与C和Fortran混合编程。我还没有完全掌握分配的工作原理。该程序易于用户扩展,用户通常需要分配一些全局可访问的阵列供以后使用。这是通过使用一个内存地址数组来实现的,该数组指向动态可分配数组的起始地址。当然,地址数组中的哪个元素指向哪个信息都取决于用户在开始真正编程之前必须学习的约定。有两个地址数组,一个用于整数,另一个用于浮点
  • 所谓肮脏的黑客,我指的是不一致的。例如,GNU编译器的优化算法中的更新导致程序以随机内存泄漏的方式退出
  • 这个节目一点也不优雅。全局变量名通常较短(3-4个字符)且晦涩难懂。当然,跨例程传递数据是通过使用公共块来完成的,公共块包括所有程序开关和前面提到的数组
  • 该程序的使用大致上类似于交互式shell,尽管它很愚蠢。首先,程序本身读取一个输入文件,然后根据选择将用户放入一个伪shell,用户必须在其中键入4个字符宽的命令,然后键入参数。然后解析器解析命令,并使用参数调用相应的子例程。您可能会猜到,在这个伪解析器(goto-bonanza)中有一个循环结构,它以一种比21世纪更复杂的方式包装子例程行为
  • 输入文件的格式是相同的(命令,然后是参数),因为它是相同的解析器。但语法并不完全一致(我的意思是,它缺乏控制结构,一些命令导致有限状态机执行与其他命令相矛盾的行为;它缺乏明确的语法),有时会导致最终用户发现陷阱。用户必须通过经验了解这些陷阱;我没有在该计划的任何文档中看到它们。这是一个可以用python轻松避免的问题,甚至不需要实现解析器
我想做的是:

  • 将程序的部分移植到python中,即与数值计算无关的部分。这包括
    • 使用python中的OOP方法清理和抽象API
    • 给出有意义的变量名
    • 将动态分配迁移到numpy或Fortran 90并丢失C部分
    • 将非数值执行迁移到python,并使用
      f2py
      包装数值对象,因此不会降低性能。我有没有告诉过你,这个程序在当前状态下速度太快了?希望将对数值子例程的调用和对python的I/O移植不会将其降低到不切实际的水平(或者会吗?)
    • 使用python的交互式shell替换伪shell。这样,最终用户就不会有任何不一致之处。前面提到的命令将被python中定义的函数简单地替换。这将允许用户实际访问数据。此外,用户将能够扩展程序而无需深入
我想知道的是:

  • f2py
    是否适合包装大量子例程和公共块而不产生任何混乱?我在网上只看到了
    f2py
    的单个文件示例;我知道numpy用它来包装LAPACK和其他东西,但我需要确保
    f2py
    是一个足够一致的工具来完成这项任务
  • 是否有任何关于我应该遵循的总体战略的建议,或者我应该避免的陷阱
  • 我应该如何在这个python包装的Fortran 90环境中实现一个系统,以便能够在Fortran例程中修改(分配和分配)全局可访问的数组和变量。这最好省略地址数组,我最好能够将口头表示注入到名称空间中。这些变量最好在python和fortran中都可以访问
注:

  • 我可能要求的太多了,超出了可能的范围。在这种情况下,请原谅我,因为我是这方面编程的初学者;别犹豫,纠正我
  • 我一直在谈论的“程序”是开源的,但它是商业性的,并且许可证不允许发布,所以我决定不提及它的名称。然而,你可以从第二句和我从头到尾的描述中推断出来

    • 我也在做类似的事情。我们没有通过C进行动态内存分配,而是使用一个带有整数索引的全局数组(也在全局范围内),但在其他方面基本相同。奇怪的,不一致的输入文件和所有

      我建议不要试图重写大部分程序,不管是用python还是其他语言。这很费时,令人不快,而且基本上没有必要。另一种方法是,让F77代码库知道它是否编译得足够干净,以至于您愿意信任它,然后编写一个接口例程

      我现在有一个很大的、丑陋的F77代码库,它位于一个接口后面。该计划需要