gpt4 book ai didi

python - 移植旧的fortran程序以与python + numpy一起使用

转载 作者:太空狗 更新时间:2023-10-30 01:15:11 25 4
gpt4 key购买 nike

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

  • 这是怪物。它大约是240,000行。
  • 自从它在Fortran 77中开始使用以来,它使用了一些非常脏的技巧来进行动态内存分配。基本上,它使用C标准库中的功能,以及C和Fortran的混合编程。我尚未完全掌握分配的工作方式。该程序被构建为易于用户扩展,并且用户通常需要分配一些全局可访问的数组以供以后使用。这是通过给一个内存地址数组来实现的,该地址指向动态可分配数组的起始地址。当然,在开始真正编程之前,地址数组的哪个元素都指向哪些信息都取决于用户必须学习的约定。有两个地址数组,一个用于整数,另一个用于浮点数。
  • 肮脏的hacks,我的意思是不一致的。例如,GNU编译器的优化算法的更新导致程序退出时出现了随机内存泄漏。
  • 该程序远非优雅。全局变量名称通常简短(3-4个字符)且含糊不清。当然,通过使用常规块(包括所有程序开关和上述数组)可以在例程之间传递数据。
  • 该程序的用法与交互式shell的用法大致相同,尽管它是一个愚蠢的程序。首先,程序本身读取输入文件,然后根据选择将用户放入伪 shell 中,在该 shell 中用户必须键入4个字符宽的命令,然后键入参数。解析器然后解析命令,并使用参数调用相应的子例程。您可能会猜想,该伪解析器中有一个循环结构(而是goto财富),它以比21世纪更复杂的方式包装了子例程行为。
  • 输入文件的格式是相同的(因为是相同的解析器,所以命令(然后是参数))是相同的。但是语法实际上并不一致(通过这种方式,我的意思是它缺乏控制结构,并且某些命令导致有限状态机执行与其他命令相抵触的行为;缺少明确的语法),有时会导致最终用户发现陷阱。用户必须通过经验来学习这些陷阱。我没有在程序的任何文档中看到它们。这是一个可以使用python轻松解决的问题,甚至没有必要实现解析器。

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

  • 我想知道的是:
  • f2py是否适合并且可以完成无数个包装许多子例程和通用块的任务?我只在网上看到f2py的单文件示例;我知道numpy已使用它包装LAPACK和其他内容,但是我需要保证f2py是足以完成此任务的工具。
  • 是否对我应该遵循的总体策略有任何建议,还是应该避免的陷阱。
  • 如何并且应该在此python封装的Fortran 90环境中实现一个系统,这样我就可以在fortran例程中修改(分配和分配)全局可访问的数组和变量。这应该最好省略地址数组,而我最好应该能够将语言表示注入(inject)到 namespace 中。这些变量最好在python和fortran中都可以访问。

  • 笔记:
  • 我可能一直要求太多,这超出了可能领域的范围。在这种情况下,请原谅我,因为我是编程方面的初学者。并毫不犹豫地纠正我。
  • 我一直在谈论的“程序”是开源的,但是它是商业性的,并且许可证不允许其分发,因此我决定不提它的名称。但是,您可以从第二句话和我在全文中给出的描述中推论得出。
  • 最佳答案

    我正在做令人沮丧的事情。除了使用C进行动态内存分配外,我们还有一个带有整数索引的全局数组(也在全局范围内),但是在其他方面却大同小异。奇怪,输入文件不一致。

    我建议不要尝试重写大部分程序,无论是使用python还是其他方式。这是耗时的,令人不快的并且在很大程度上是不必要的。作为替代方案,使F77代码库达到是否可以完全干净地编译以使您愿意信任它的程度,然后编写接口(interface)例程。

    我现在有一个很大的,难看的F77代码库,它位于界面的后面。该程序需要输入为文本文件,因此界面的大部分工作是生成该文本文件。除此之外,遗留代码简化为一个网关例程,该例程接受一些参数(包括识别文本文件的方法)并返回答案。如果使用Fortran 2003的iso_c_binding,则可以采用C可以理解的格式公开接口(interface),此时可以将其链接到所需的任何内容。

    就现代代码(主要是优化例程)而言,遗留代码库是C接口(interface)背后的单个子例程。这比尝试进一步修改旧代码好得多,并且可能对您的情况也是一种有效的策略。

    关于python - 移植旧的fortran程序以与python + numpy一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23574720/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com