Kevin Smyth
Kevin Smyth

Reputation: 1947

OpenMDAO: unit conversion with pass_by_obj

Is unit conversion with pass_by_obj supported in OpenMDAO 1.4? I have a small repro case:

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()

With pass_by_obj=True, the assert fails. top.setup() reports:

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

So I'd expect the unit conversion to be done.

Upvotes: 0

Views: 140

Answers (1)

Bret Naylor
Bret Naylor

Reputation: 754

OpenMDAO currently does not support automatic unit conversions for pass_by_obj variables. When designing OpenMDAO, we didn't intend for floating point data to be transferred using pass_by_obj. We only added pass_by_obj to handle other kinds of variables. We should fix the diagnostic output of setup so that it doesn't list unit conversions that don't actually happen. I'll put a story in for that.

Upvotes: 2

Related Questions