2016-01-14 5 views
0

Является ли конвертация единиц с 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 

Так что я бы ожидать, что блок преобразования должно быть сделано.

ответ

2

В настоящее время OpenMDAO не поддерживает автоматические преобразования единиц для переменных pass_by_obj. При разработке OpenMDAO мы не собирались переносить данные с плавающей точкой, используя pass_by_obj. Мы добавили pass_by_obj для обработки других видов переменных. Мы должны исправить диагностический вывод установки, чтобы он не перечислял преобразования единиц, которые на самом деле не происходят. Я расскажу историю.

+0

Мы должны сделать это жесткой ошибкой, если единицы объявлены в переменных pbo. –

+0

Спасибо за быстрый ответ. Для нас это не очень удобно, так как у нас есть Компоненты, которые изменяют форму их неизвестных на основе параметров. Для этого нам нужно 'pass_by_obj'. У вас есть предложение о том, как сделать преобразование единиц в этом случае? –

+0

Есть несколько вариантов. Один из них - это вручную вставить компонент преобразования. Я думаю, что лучшим вариантом было бы найти способ сделать это без pass_by_obj. Один из способов, которым вы могли бы это сделать, - обнулить переменную изменения формы, а затем передать дополнительный индексный параметр, который содержит используемую ширину, чтобы вы могли заполнить его вычисленными значениями до ширины. Идеально использовать систему прохода данных поплавка как можно больше, чтобы вы могли воспользоваться такими функциями, как преобразование единиц измерения и аналитические градиенты. –

 Смежные вопросы

  • Нет связанных вопросов^_^