Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在OpenMDAO中运行f2py包装的、基于PETSc的fortran代码时写入语句导致的错误_Python_Macos_Mpi_Networkx_Openmdao - Fatal编程技术网

Python 在OpenMDAO中运行f2py包装的、基于PETSc的fortran代码时写入语句导致的错误

Python 在OpenMDAO中运行f2py包装的、基于PETSc的fortran代码时写入语句导致的错误,python,macos,mpi,networkx,openmdao,Python,Macos,Mpi,Networkx,Openmdao,我正在使用f2py包装我基于PETSc的fortran分析代码,以便在OpenMDAO中使用(如建议的)。我没有直接使用f2py,而是使用它生成相关的.c、.pyc等文件,然后自己使用mpif90链接它们 在一个简单的python环境中,我可以导入我的.so并毫无问题地运行代码: >>> import module_name >>> module_name.execute() expected code output... 但是,当尝试在OpenMDAO组

我正在使用f2py包装我基于PETSc的fortran分析代码,以便在OpenMDAO中使用(如建议的)。我没有直接使用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对象有关,如对的回答中所述?我目前没有这样做,因为我不清楚在我的情况下应该如何做

当我试图查找有关所获得错误的特定信息时,搜索结果几乎总是指向mpif90或gfortran库,并且可能需要重新编译或更新库。然而,这并不能向我解释为什么我的分析在简单的python代码中可以很好地工作,而在OpenMDAO中却不能

更新:根据其他人的建议,我尝试了更多的方法。首先,无论是使用
mpiexecpython
还是仅使用
python
运行,我都会得到错误。我确实设置了PETSc实现,假设它没有引用中的
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(我假设你们就是这么做的,是吗?)而不是mpif90编译f2py包装的东西,我就不会得到错误。不幸的是,这导致我的fortran代码中的PETSc内容产生一些奇怪的错误,可能是因为根据PETSc编译规则,那些.f90/.f90文件是由mpif90编译的,即使我强制最终编译使用gfortran

更新4:我终于能够解决
内部错误:list\u formatted\u write()
问题。通过使用
mpif90--showme
我可以看到mpif90使用的标志(因为它本质上只是gfortran加上一些标志)。它省略了标志
-Wl,-flat_名称空间
,从而消除了与打印相关的错误

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

from petsc4py import PETSc
import pc_fort_mod
pc_fort_mod.execute()
导致fortran分析中出现PETSc错误(矩阵无效,预分配不成功)。这对我来说似乎是合理的,因为两者似乎都试图使用相同的PETSc库。你知道有什么方法可以做到这一点,使PETSc和petsc4py不冲突吗?我想解决办法可能是有两个PETSc版本


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

我以前从未见过类似的情况,我们使用过network-X,将编译好的fortran封装在F2py中,多次在MPI下运行

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


您使用的是哪种python,运行的是什么操作系统?我们在运行anacondapython安装时运气很好。不过,在安装petsc时,您必须小心一点。从源代码构建并运行PETSc测试是最安全的方法

这应该是一个更好的评论。谢谢你的建议。我已经在我的原始帖子中添加了一些进一步调试工作的结果。添加了有关我的运行环境、PETSc/python版本等的更多信息。我不建议您使用自制的PETSc。你一定要自己编译。我还没有成功地用自制的配方制作这个包。@JustinGray我一定会在将来记住这一点;我能理解为什么自制软件对于如此复杂的软件包来说可能不是最理想的,尽管它目前似乎对我有效。我已经解决了打印问题,但是现在有多个代码试图访问PETSc(参见更新4)。