2016-02-16 3 views
0

Я просто играю с учебником Paraboloid в OpenMDAO. Я пробовал что-то простое, в основном меняя входные значения на компонент Paraboloid. См. Следующий код. Когда я запустил его, он напечатает тот же результат, как если бы ничего не произошло. Так, что происходит? если у меня есть группа, как мне изменить входные данные?В OpenMDAO как указать значения для IndepVarComp или других компонентов?

from __future__ import print_function 


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

class Paraboloid(Component): 
    """ Evaluates the equation f(x,y) = (x-3)^2 + xy + (y+4)^2 - 3 """ 

    def __init__(self): 
     super(Paraboloid, self).__init__() 

     self.add_param('x', val=0.0) 
     self.add_param('y', val=0.0) 

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

    def solve_nonlinear(self, params, unknowns, resids): 
     """f(x,y) = (x-3)^2 + xy + (y+4)^2 - 3 
     """ 

     x = params['x'] 
     y = params['y'] 

     unknowns['f_xy'] = (x-3.0)**2 + x*y + (y+4.0)**2 - 3.0 

    def linearize(self, params, unknowns, resids): 
     """ Jacobian for our paraboloid.""" 

     x = params['x'] 
     y = params['y'] 
     J = {} 

     J['f_xy', 'x'] = 2.0*x - 6.0 + y 
     J['f_xy', 'y'] = 2.0*y + 8.0 + x 
     return J 

if __name__ == "__main__": 

    top = Problem() 

    root = top.root = Group() 

    root.add('p1', IndepVarComp('x', 3.0)) 
    root.add('p2', IndepVarComp('y', -4.0)) 
    root.add('p', Paraboloid()) 

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


    root.p1.x=3.0; 
    root.p2.y=-4.0; 
    top.setup() 
    top.run() 
    print(root.p.unknowns['f_xy']) 

    root.p1.x=5.0; 
    root.p2.y=5.0; 
    top.setup() 
    top.run() 
    print(root.p.unknowns['f_xy']) 
+0

мне удалось изменить входные значения для этой системы путем установки значений с следующий код: top.setup() root.p1.unknowns ['x'] = 5.0; root.p2.unknowns ['y'] = 5.0; top.run() print (root.p.unknowns ['f_xy']) –

+0

Кажется, OpenMDAO игнорирует элементы данных. Когда добавляется вывод, он не является членом, а просто строкой для словарного ключа, которая должна быть заполнена при доступе к компоненту. Кажется, IndepVarComp строит свой словарь в настройке со значением по умолчанию, поэтому раньше он был проигнорирован. –

+0

Я задаю вопрос, правильно ли я устанавливаю значения? Есть ли метод get() и set(), который я должен использовать вместо этого? Поддерживает ли OpenMDAO отслеживание изменений ввода для других целей? –

ответ

0

Прежде чем вы сможете установить любые значения, вам необходимо позвонить setup(). После этого вы устанавливаете их через словарь, как доступ из экземпляра проблемы. Для вашего образца кода он должен выглядеть следующим образом:

top.setup() 
top['p1.x'] = 3. 
top['p2.y'] = 4. 
top.run() 
print(top['p.f_xy']) 

top['p1.x'] = 10. 
top['p2.y'] = 10. 
top.run() 
print(top['p.f_xy']) 

Когда я запускаю эту модель с отрегулированным сценарием я получаю:

############################################## 
Setup: Checking for potential issues... 

No recorders have been specified, so no data will be saved. 

Setup: Check complete. 
############################################## 

73.0 
342.0 
+0

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

+0

Это неверно. Когда вы меняете входы, вам нужно вызвать run(), чтобы он пересчитывал базу на новые входные значения. –

+0

Я просто пытаюсь понять архитектуру немного. Похоже, что компоненты не сохраняют входы/выходы в качестве членов. Все дело в add_param и add_output - это просто сообщить системе openMDAO об I/O. Затем группа управляет выполнением всех компонентов. Это верно? –

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

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