OpenMDAO:使用 pass_by_obj 进行单位转换

OpenMDAO: unit conversion with pass_by_obj

OpenMDAO 1.4 是否支持 pass_by_obj 的单位转换?我有一个小的复制案例:

from openmdao.api import Component, Problem, Group, IndepVarComp

pass_by_obj=True

class PassByObjParaboloid(Component):
    def __init__(self):
        super(PassByObjParaboloid, self).__init__()
        self.fd_options['force_fd'] = True

        self.add_param('x', val=1.0, pass_by_obj=pass_by_obj, units='mm')

        self.add_output('f_xy', val=0.0)

    def solve_nonlinear(self, params, unknowns, resids):
        print params['x']
        assert params['x'] == 1000.0

        unknowns['f_xy'] = params['x']

    def linearize(self, params, unknowns, resids):
        raise Exception()

top = Problem()

root = top.root = Group()

root.add('p1', IndepVarComp('x', 1.0, pass_by_obj=pass_by_obj, units='m'))
root.add('p', PassByObjParaboloid())

root.connect('p1.x', 'p.x')

top.setup()
top.run()

使用 pass_by_obj=Trueassert 失败。 top.setup() 报告:

Unit Conversions
p1.x -> p.x : m -> mm

所以我希望完成单位转换。

OpenMDAO 当前不支持 pass_by_obj 变量的自动单位转换。在设计 OpenMDAO 时,我们并没有打算使用 pass_by_obj 来传输浮点数据。我们只添加了 pass_by_obj 来处理其他类型的变量。我们应该修复安装程序的诊断输出,这样它就不会列出实际上没有发生的单位转换。我会为此写一个故事。