Является ли конвертация единиц с pass_by_obj
в OpenMDAO 1.4? У меня есть небольшой REPRO случай:OpenMDAO: преобразование единиц измерения с 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=True
, то assert
терпит неудачу. top.setup()
отчеты:
Unit Conversions
p1.x -> p.x : m -> mm
Так что я бы ожидать, что блок преобразования должно быть сделано.
Мы должны сделать это жесткой ошибкой, если единицы объявлены в переменных pbo. –
Спасибо за быстрый ответ. Для нас это не очень удобно, так как у нас есть Компоненты, которые изменяют форму их неизвестных на основе параметров. Для этого нам нужно 'pass_by_obj'. У вас есть предложение о том, как сделать преобразование единиц в этом случае? –
Есть несколько вариантов. Один из них - это вручную вставить компонент преобразования. Я думаю, что лучшим вариантом было бы найти способ сделать это без pass_by_obj. Один из способов, которым вы могли бы это сделать, - обнулить переменную изменения формы, а затем передать дополнительный индексный параметр, который содержит используемую ширину, чтобы вы могли заполнить его вычисленными значениями до ширины. Идеально использовать систему прохода данных поплавка как можно больше, чтобы вы могли воспользоваться такими функциями, как преобразование единиц измерения и аналитические градиенты. –