在OpenMDAO

时间:2017-03-30 21:54:09

标签: python macos mpi networkx openmdao

我正在使用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下运行可能会导致此问题的不同之处是什么?可能与需要传递comm对象有关,如my original question的答案中所述?我现在不这样做,因为the relevant OpenMDAO example我不清楚在我的案例中应该怎么做。

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

更新:根据其他人的建议,我尝试了一些其他的事情。首先,无论我是使用mpiexec python <script>还是仅使用python <script>,我都会收到错误消息。我确实设置了PETSc实现,假设它没有引用this exampleif 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_mod PETSc和petsc4py PETSC不会发生冲突?我想解决方法可能是有两个PETSc构建......

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

1 个答案:

答案 0 :(得分:0)

之前我从来没有见过这样的东西,我们已经使用了包含在F2py中的编译fortran的network-X,在MPI下运行了很多次。

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

你使用的是哪个python,你在运行什么操作系统?我们运行anaconda python安装非常好运。安装petsc时你必须要小心一点。从源头构建并运行PETSc测试是最安全的方法。