【问题标题】:Errors caused by write statements when running f2py-wrapped, PETSc-based fortran code in OpenMDAO在 OpenMDAO 中运行 f2py-wrapped、基于 PETSc 的 fortran 代码时由 write 语句引起的错误
【发布时间】:2017-08-25 00:55:27
【问题描述】:

我正在使用 f2py 包装我的基于 PETSc 的 fortran 分析代码,以便在 OpenMDAO 中使用(建议 in this post)。我没有直接使用 f2py,而是使用它来生成相关的 .c、.pyc 等文件,然后自己使用 mpif90 链接它们。

在一个简单的python环境中,我可以导入我的.so并运行代码没有任何问题:

>>> import module_name
>>> module_name.execute()

expected code output...

但是,当尝试在 OpenMDAO 组件中执行相同操作时,我收到以下错误:

At line 72 of file driver.F90
Internal Error: list_formatted_write(): Bad type

即使在串行运行时也会发生这种情况,并且错误出现在我使用 write(*,*) 的 fortran 代码中的第一位。在可能导致此问题的 OpenMDAO 下运行有什么不同?正如my original question 的答案中提到的,它可能与传递 comm 对象的需要有关吗?我目前没有这样做,因为从the relevant OpenMDAO example 中我不清楚在我的情况下应该如何做。

当我尝试查找有关我遇到的错误的具体信息时,搜索结果几乎总是指向 mpif90 或 gfortran 库,并且可能需要重新编译或更新这些库。但是,这并没有向我解释为什么我的分析在简单的 python 代码中可以很好地工作,但在 OpenMDAO 中却不行。

更新:根据其他人的建议,我尝试了更多的方法。首先,无论我是使用mpiexec python <script> 还是仅使用python <script> 运行,我都会收到错误消息。我确实设置了 PETSc 实现,假设它没有引用 this example 中的 if MPI 块之外的任何内容。

在我的独立测试中,我能够成功导入一些东西,包括

from mpi4py import MPI
from petsc4py import PETSc
from openmdao.core.system import System
from openmdao.core.component import Component
from openmdao.core.basic_impl import BasicImpl
from openmdao.core._checks import check_connections, _both_names
from openmdao.core.driver import Driver
from openmdao.core.mpi_wrap import MPI, under_mpirun, debug
from openmdao.components.indep_var_comp import IndepVarComp
from openmdao.solvers.ln_gauss_seidel import LinearGaussSeidel
from openmdao.units.units import get_conversion_tuple
from openmdao.util.string_util import get_common_ancestor, nearest_child, name_relative_to
from openmdao.util.options import OptionsDictionary
from openmdao.util.dict_util import _jac_to_flat_dict

我测试的东西没有太多的押韵或理由,只是随机钻了几个兔子洞(更多的方向会很棒)。以下是在同一脚本中导入时会导致错误的一些事情:

from openmdao.core.group import Group
from openmdao.core.parallel_group import ParallelGroup
from openmdao.core.parallel_fd_group import ParallelFDGroup
from openmdao.core.relevance import Relevance
from openmdao.solvers.scipy_gmres import ScipyGMRES
from openmdao.solvers.ln_direct import DirectSolver

所以看起来 MPI 导入不是问题?但是,由于不太了解 OpenMDAO 代码,我无法在有问题的导入中看到公共线程。

更新 2: 我应该补充一点,我对 networkx 包变得特别怀疑。如果我的脚本很简单

import networkx as nx
import module_name
module_name.execute()

然后我得到错误。但是,如果我在networkz 之前导入我的模块(即在上面的块中切换第 1 行和第 2 行),我不会收到错误消息。更奇怪的是,如果我也导入 PETSc:

from petsc4py import PETSc
import networkx as nx
import module_name
module_name.execute()

然后一切正常......

更新 3: 我正在运行 OS X El Capitan 10.11.6。我真的不记得我是如何安装我正在使用的python2.7(目前需要使用这个而不是3.x)的。多年前安装,位于/usr/local/bin。但是,我切换到 anaconda 安装,重新安装 networkx,仍然得到同样的错误。

我发现如果我使用 gfortran 编译 f2py 包装的东西(我假设这是你们所做的,是吗?)而不是 mpif90,我不会得到错误。不幸的是,这会导致我的 fortran 代码中的 PETSc 内容产生一些奇怪的错误,可能是因为根据 PETSc 编译规则,那些 .f90/.F90 文件是由 mpif90 编译的,即使我强制最终编译使用 gfortran。

更新 4: 我终于能够解决 Internal Error: list_formatted_write() 问题。通过使用mpif90 --showme,我可以看到mpif90 正在使用什么标志(因为它本质上只是gfortran 加上一些标志)。它省略了标志-Wl,-flat_namespace 摆脱了那些与打印相关的错误。

现在我可以毫无问题地导入大部分内容并运行我的代码,但有一个重要例外。如果我有一个基于 petsc 的 fortran 模块 (pc_fort_mod),那么还要将 PETSc 导入 python 环境,即

from petsc4py import PETSc
import pc_fort_mod
pc_fort_mod.execute()

在 fortran 分析中导致 PETSc 错误(无效的矩阵、不成功的预分配)。这对我来说似乎是合理的,因为两者似乎都在尝试使用相同的 PETSc 库。知道是否有办法做到这一点,以便pc_fort_modPETSc 和petsc4pyPETSC 不会发生冲突?我想一种解决方法可能是有两个 PETSc 版本...

已解决:有人告诉我,Update 4 中描述的问题最终不应该是问题——应该可以在 python 和 fortran 中同时使用 PETSc。我最终能够通过使用自编译的 PETSc 构建而不是 Homebrew 配方来解决我的错误。

【问题讨论】:

  • 我不建议你使用自制的 petsc。你绝对应该自己编译它。我对那个包的自制配方没有任何成功。
  • @JustinGray 以后我一定会牢记这一点;我可以理解为什么 Homebrew 对于如此复杂的软件包可能不是最理想的,尽管它目前似乎对我有用。我已经解决了打印问题,但现在遇到了多个代码尝试访问 PETSc 的问题(请参阅更新 4)。

标签: python macos mpi networkx openmdao


【解决方案1】:

我以前从未见过这样的事情,我们已经使用了 network-X 和 F2py 中的编译 fortran,在 MPI 下运行了很多次。

我建议您删除并重新安装您的 network-x 软件包。

您使用的是哪个 python 以及您在哪个操作系统上运行?我们非常幸运地运行了 anaconda python 安装。不过在安装 petsc 时你必须要小心一点。从源代码构建并运行 PETSc 测试是最安全的方法。

【讨论】:

  • 这应该作为评论发布。
  • 感谢您的建议。我已将一些进一步调试工作的结果添加到我的原始帖子中。
  • 添加了有关我的运行环境、PETSc/python 版本等的更多信息。
猜你喜欢
  • 1970-01-01
  • 2017-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多