如何正确地将标量连接到矢量条目?

How to properly connect a scalar to a vector entry?

我们正在寻找一种方法将标量(作为输出)连接到向量条目(作为输入)。

"Nonlinear Circuit Analysis" 示例中,class Node 中有一个解决方法,它遍历标量的数量并将每个标量添加为新输入。在 class Circuit 中,添加的输入随后通过其“ 索引 ”(例如 'I_in:0')访问。

在我们的例子中,这个循环必须由一个新的组件集成,它只循环新的输入。这就是为什么我们要避免循环并直接使用向量和矩阵运算。就 Circuit 示例而言,实现此目的的一种方法是使用某种目标索引(参见 tgt_indices),但尚未实现(尚未)。 在这种情况下,类 都将如下所示:

class Node(om.ImplicitComponent):
    """Computes voltage residual across a node based on incoming and outgoing current."""

    def initialize(self):
        self.options.declare('n_in', default=1, types=int, desc='number of connections with + assumed in')
        self.options.declare('n_out', default=1, types=int, desc='number of current connections + assumed out')

    def setup(self):
        self.add_output('V', val=5., units='V')

        self.add_input('I_in', units='A', shape=self.options['n_in'])
        self.add_input('I_out', units='A', shape=self.options['n_out'])

    def apply_nonlinear(self, inputs, outputs, residuals):
        residuals['V'] = 0.
        residuals['V'] += inputs['I_in'].sum()
        residuals['V'] -= inputs['I_out'].sum()

class Circuit(om.Group):

    def setup(self):
        self.add_subsystem('n1', Node(n_in=1, n_out=2), promotes_inputs=[('I_in')])
        self.add_subsystem('n2', Node())  # leaving defaults

        self.add_subsystem('R1', Resistor(R=100.), promotes_inputs=[('V_out', 'Vg')])
        self.add_subsystem('R2', Resistor(R=10000.))
        self.add_subsystem('D1', Diode(), promotes_inputs=[('V_out', 'Vg')])

        self.connect('n1.V', ['R1.V_in', 'R2.V_in'])
        self.connect('R1.I', 'n1.I_out', tgt_indices=[0])
        self.connect('R2.I', 'n1.I_out', tgt_indices=[1])

        self.connect('n2.V', ['R2.V_out', 'D1.V_in'])
        self.connect('R2.I', 'n2.I_in', tgt_indices=[0])
        self.connect('D1.I', 'n2.I_out', tgt_indices=[0])

        ...

所以主要方面是将输出标量连接到类似于 src_indices 选项的输入向量的条目。有没有办法做到这一点或反对这样做的理由?

由于我们计划使用 Dymos,因此我们希望使用此功能的高一维并将输出向量连接到输入矩阵的行。

您说得对,目前 OpenMDAO 中没有 tgt_indices 之类的功能。虽然它在技术上是可行的,但它确实提出了一些 API 设计和内部实践挑战。如果您对该功能的 need/value 有强烈的感觉,您可以考虑提交一份 POEM 描述您提议的 API 以供开发团队考虑。您可以从提供的示例开始,但您需要仔细考虑以下细节:

  • 如果用户同时提供 src_indicestgt_indices 会怎样?
  • 如果有重叠,错误消息会是什么样子 tgt_indices
  • api如何扩展到promotes功能。

与此同时,您需要使用 MuxComponent,或者编写您自己的该组件版本,以接收数组输入并将它们推入组合矩阵。添加这样的组件效率有点低,但在宏伟的计划中它应该不会太糟糕(只要你花时间为它定义解析导数。CS/FD 这个组件会很昂贵).