在OpenMDA中运行基于petscfortran的f2pywrapped代码时由write语句引起的错误

2024-09-27 22:40:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用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的回答中所述?我现在没有这么做,因为我不清楚在我的情况下应该怎么做。你知道吗

当我试图找到关于我得到的错误的特定信息时,搜索结果几乎总是指向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

没有太多的押韵或理由,我测试,只是去了几个随机兔子洞(更多的方向将是美妙的)。以下是在同一个脚本中导入时会导致错误的do

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库。有没有办法让宠物Sc和petsc4pyPETSC不冲突?我想解决办法可能是有两个PETSc版本。。。你知道吗

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


Tags: 代码namefromcoreimportexecute错误util
1条回答
网友
1楼 · 发布于 2024-09-27 22:40:02

我以前从未见过这样的情况,我们使用network-X和F2py包装的编译fortran,在MPI下运行过很多次。你知道吗

我建议您删除并重新安装network-x包。你知道吗

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

相关问题 更多 >

    热门问题