【问题标题】:OpenMDAO: unit conversion with pass_by_objOpenMDAO:使用 pass_by_obj 进行单位转换
【发布时间】:2016-01-14 16:53:17
【问题描述】:

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


    【解决方案1】:

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

    【讨论】:

    • 如果在 pbo 变量上声明了单位,我们应该让它成为一个硬错误。
    • 感谢您的快速回复。这对我们来说不是很好,因为我们的组件会根据参数改变其未知数的形状。所以我们需要pass_by_obj。您对这种情况下如何进行单位转换有什么建议吗?
    • 有几个选项。一种是让您手动插入转换组件。我认为更好的选择是找到一种无需 pass_by_obj 的方法。您可以做到这一点的一种方法是将您的形状变化未知数填充为零,然后传递一个包含可用宽度的附加索引参数,以便您可以用计算值填充它直到宽度。尽可能多地使用浮点数据传递系统是理想的,这样您就可以利用单位转换和解析梯度等功能。
    • 我们决定为 PBO Float 和 FloatArray 类型添加单位转换以支持您的模型。它应该在接下来的几周内完成。如果您的数组正在改变大小,那么使用 PBO 对象是合理的做法。但是请注意,这只允许您不尝试计算解析导数。如果你确实计算跨 PBO 连接的解析导数,你会得到一个非常错误的答案!
    • 谢谢各位。作为参考,github.com/OpenMDAO/OpenMDAO/pull/449 是这个的 PR
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-20
    • 2014-01-30
    相关资源
    最近更新 更多