【问题标题】:Are connect operations required to enforce the order of execution in openMDAO?是否需要连接操作来强制执行 openMDAO 中的执行顺序?
【发布时间】:2016-10-12 21:02:17
【问题描述】:

我尝试使用没有参数和未知数的组件使用 OpenMDAO 包装三个外部代码。这是因为这三个代码只取输入文件和输出文件,不需要将输入变量“连接”到输出变量。但是,这些代码会乱序运行(因为很明显,它们没有依赖信息)。然后我看到正确的方法是使用 ExternalCodeComponent,但即便如此,我们仍然必须通过 connect 调用将输入连接到输出。

这是通过对一个组件输出和另一个组件的输入使用连接方法来指定依赖项的唯一方法吗?当输出已经在下一个组件的输入文件中时,必须将输出传递给第二个组件似乎是多余的。如果它是强制性的,它是否可以只在从未使用过的其他组件上发送虚拟值,只是为了定义依赖关系?

干杯。

【问题讨论】:

    标签: openmdao


    【解决方案1】:

    您可以使用 set order 方法为 Group 中的子系统设置执行顺序。

    def set_order(self, new_order):
        """ Specifies a new execution order for this system. This should only
        be called after all subsystems have been added.
    
        Args
        ----
        new_order : list of str
            List of system names in desired new execution order.
        """
    

    如果您想查看该系统的当前订单,可以调用:

    my_system.list_order()
    

    您必须小心,因为您可以使用set_order 使事情以无序的数据流运行。

    请注意,这是您问题的快速解决方案,但我认为 OpenMDAO 通常最好对底层数据流有所了解,以便其他功能(例如数据流查看器)正确显示内容。显然,您可以通过名义上将某些东西传入和传出隔离组件来完成这项工作。此外,如果您正在进行梯度优化,连接也会使 OpenMDAO 不排除这部分模型,因为在导数计算中不相关。

    【讨论】:

    • 可以 set_order (或者就此而言,OpenMDAO 是否支持运行两个组件,它们都只同时依赖于前一个组件的输出,或者每个组件都必须串行执行(在这种情况下, set_order 可以强制执行命令)。当从代码 A 的输出到代码 B 和 C 的输出进行连接时,顺序是如何设置的?是连接的顺序吗?
    • 如果您想同时执行两个(或更多)组件,请将并行执行的组件放在一个 ParallelGroup 中(与标准组相反)。您必须使用 MPI 运行。
    • 您可以使用并行组并行运行多个组件。以下是一些说明如何做到这一点的文档:openmdao.readthedocs.io/en/1.7.2/usr-guide/examples/…
    • 是的,在这种特殊情况下,我试图避免 MPI。我知道 MPI 部分。谢谢。
    猜你喜欢
    • 2020-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-01
    • 1970-01-01
    • 2022-09-27
    • 1970-01-01
    相关资源
    最近更新 更多