2015-11-30 3 views
0

Я пытаюсь подключить последний элемент вывода одного компонента к входу другого компонента. Пример приведен ниже:Подключение элемента массива к другому входу компонента

import numpy as np 
from openmdao.api import Component, Problem, Group 

class C1(Component): 
    def __init__(self): 
     super(C1, self).__init__() 
     self.add_param('fin', val=1.0) 
     self.add_output('arr', val=np.zeros(5)) 

    def solve_nonlinear(self, params, unknowns, resids): 
     fin = params['fin'] 
     unknowns['arr'] = np.array([2*fin]) 


class C2(Component): 
    def __init__(self): 
     super(C2, self).__init__() 
     self.add_param('flt', val=0.0) 
     self.add_output('fout', val=0.0) 

    def solve_nonlinear(self, params, unknowns, resids): 
     flt = params['flt'] 
     unknowns['fout'] = 2*flt 

class A(Group): 
    def __init__(self): 
     super(A, self).__init__() 

     self.add('c1', C1()) 
     self.add('c2', C2()) 

     self.connect('c1.arr[-1]', 'c2.flt') 

if __name__ == '__main__': 

    a = Problem() 
    a.root = A() 
    a.setup() 

    a.run() 
    print a.root.c2.unknowns['fout'] 

Я дал ошибку:

openmdao.core.checks.ConnectError: Source 'c1.arr[-1]' cannot be connected to target 'c2.flt': 'c1.arr[-1]' does not exist. 

Есть ли способ сделать это? Я знаю, что это работало в старой версии OpenMDAO.

ответ

3

OpenMDAO поддерживает подключение к определенным индексам источника с помощью args src_indices. Например:

self.connect('c1.arr', 'c2.flt', src_indices=[4]) 

Отрицательные индексы в настоящее время не поддерживаются.

0

Здесь есть несколько мелких проблем. Во-первых, метод solve_nonlinear C1 имеет неправильный размер для вычисления его массива. Он заканчивает работу, но вы должны действительно установить массив в правильный размер (длина 5).

Для части массива (см. docs и more advanced docs) вы указываете аргумент src_indices для подключения.

import numpy as np 
from openmdao.api import Component, Problem, Group 

class C1(Component): 
    def __init__(self): 
     super(C1, self).__init__() 
     self.add_param('fin', val=1.0) 
     self.add_output('arr', val=np.zeros(5)) 

    def solve_nonlinear(self, params, unknowns, resids): 
     fin = params['fin'] 
     unknowns['arr'] = fin*np.arange(5) 

class C2(Component): 
    def __init__(self): 
     super(C2, self).__init__() 
     self.add_param('flt', val=0.0) 
     self.add_output('fout', val=0.0) 

    def solve_nonlinear(self, params, unknowns, resids): 
     flt = params['flt'] 
     unknowns['fout'] = 2*flt 

class A(Group): 
    def __init__(self): 
     super(A, self).__init__() 

     self.add('c1', C1()) 
     self.add('c2', C2()) 

     self.connect('c1.arr', 'c2.flt', src_indices=[4,]) 

if __name__ == '__main__': 

    a = Problem() 
    a.root = A() 
    a.setup() 

    a.run() 
    print a.root.c2.unknowns['fout']