首页 > 解决方案 > OpenMDAO 为不会导致运行时错误的 ExternalCodeComp 添加命令行参数

问题描述

在 OpenMDAO V3.1 中,我使用 ExternalCodeComp 来执行 CFD 代码。通常,我会这样称呼它:

mpirun nodet_mpi --design_run

如果在适当的目录中进行了上述调用,那么它将找到适当的运行文件并执行 CFD 运行。我已经尝试了 ExternalCodeComp 的命令参数;

execute = ['mpirun', 'nodet_mpi', '--design_run']
execute = ['mpirun', 'nodet_mpi --design_run']
execute = ['mpirun nodet_mpi --design_run']

我要么得到一个错误,例如:

RunTimeError:255,文件“nodet_mpi --design_run”上的 execvp 错误(没有这样的文件或目录)

或者找不到该命令。

当未定义输入文件时,有什么方法可以设置执行语句以包含流求解器的命令行参数?

提前致谢!

标签: openmdao

解决方案


您的问题中的一个细节似乎不正确,您说您已经尝试过execute = "..."。ExternalCodeComp 使用一个名为command. 我将假设您在代码中使用了正确的选项。

最正确的使用形式是将所有参数作为列表中的单个条目的列表: self.options['command'] = ['mpirun', 'nodet_mpi', '--design_run']

您的错误消息似乎表明运行 OpenMDAO 的目录与您要从中执行 CFD 代码的目录不同。cd最简单的解决方案是在执行 python 脚本之前通过终端窗口确保您位于正确的目录中。

但是,您的 python 脚本位于不同的位置可能是有原因的,因此我可以建议其他选项:

  1. 您可以在已实现的方法中使用os.getcwd()和组合,以确保切换到和退出 CFD 代码的工作目录。os.chdir()compute

  2. 如果您愿意,您可以self.options['command']在计算方法中即时修改分配给选项的列表条目。您将再次依赖os模块中的某些方法来寻求帮助。os.path.exists可用于测试您需要的特定输入文件是否存在,您可以相应地修改command选项。

对于选项 2,代码如下所示:

def compute(self, inputs, outputs):

    if os.path.exists('some_input.file'): 
        self.options['command'] = ['mpirun', 'nodet_mpi', '--design_run']
    else: 
        self.options['command'] = ['mpirun', 'nodet_mpi', '--design_run', '--other_options']

    # the parent compute function actually runs the external code
    super().compute(inputs, outputs)

推荐阅读