У меня проблема с Group
, которая включает обратную связь между его подсистемами в OpenMDAO. Я использую решатель NonlinearBlockBS
. Я ожидаю, что решатель Гаусса-Зейделя будет запускать подсистемы последовательно, передавая выходы из более ранних блоков на входы других. Однако, похоже, этого не происходит, когда я реализую это в OpenMDAO.
Я сделал пример сценария, который демонстрирует эту проблему:
class A(ExplicitComponent):
def setup(self):
self.add_input('x', shape=1)
self.add_input('b', shape=1)
self.add_output('a', shape=1)
def compute(self, inputs, outputs):
outputs['a'] = inputs['x'] + 2 * inputs['b']
print('A: x = {:1.0f}, b = {:1.0f}, a = {:1.0f}'.format(inputs['x'][0], inputs['b'][0], outputs['a'][0]))
class B(ExplicitComponent):
def setup(self):
self.add_input('x', shape=1)
self.add_input('a', shape=1)
self.add_output('b', shape=1)
def compute(self, inputs, outputs):
outputs['b'] = inputs['x'] - 0.5 * inputs['a']
print('B: x = {:1.0f}, a = {:1.0}, b = {:1.0f}'.format(inputs['x'][0], inputs['a'][0], outputs['b'][0]))
if __name__ == '__main__':
ivc = IndepVarComp()
ivc.add_output('x', val=3.)
coupled_group = Group()
coupled_group.add_subsystem('A', A(), promotes=['*'])
coupled_group.add_subsystem('B', B(), promotes=['*'])
coupled_group.nonlinear_solver = NonlinearBlockGS()
prob = Problem()
model = prob.model = Group()
model.add_subsystem('I', ivc, promotes=['*'])
model.add_subsystem('C', coupled_group, promotes=['*'])
prob.setup()
prob.run_model()
Два компонента A
и B
связаны своими выходами a
и b
. Они также имеют общий параметр x
, который изначально устанавливается IndepVarComp
. При запуске код выдает следующий вывод:
=
C
=
A: x = 3, b = 1, a = 7
B: x = 3, a = 1, b = 4
A: x = 3, b = 1, a = 7
B: x = 3, a = 7, b = 1
A: x = 3, b = 1, a = 7
B: x = 3, a = 7, b = 1
NL: NLBGS Converged in 1 iterations
Параметр b
, взятый в качестве ввода A
, еще не был определен, когда A
запускается первым. Таким образом, он принимает начальное значение 1. Это, как и ожидалось. Затем запускается B
, который должен принимать выходные данные из A
, a = 7
, но вместо этого a
также устанавливается в начальное предположение 1. Это не то, что я ожидаю, когда использую метод Гаусса-Зейделя.
Тот факт, что B
не получает обновленное значение a
после запуска A
, не влияет на тот факт, что эта система сходится к правильному решению в этом случае. Однако в моем случае a = 1
не является допустимым значением для B
. Поэтому система не может сходиться.
Я что-то здесь не так делаю? Что я могу сделать, чтобы убедиться, что B
получает обновленное значение a
при первом запуске?