Начиная с OpenMDAO V2.5, вы должны быть немного осторожны при параллельном доступе к проблемным переменным.
Если вы посмотрите на полный трек стека вашей модели, вы увидите, что ошибка выдается в самом конце, когда вы вызываете
print(prob['y1'])
print(prob['y2'])
.настроили модель так, чтобы y1
существовал только в proc 0, а y2
существовал только в proc 1. Затем вы пытаетесь получить значения, которых не существует в этом proc, и вы получаете (по общему признанию, не очень ясную) ошибку,
Вы можете исправить это с помощью следующих незначительных изменений в вашем скрипте:
from openmdao.api import Problem, IndepVarComp, ParallelGroup, ExecComp, Group, NonlinearBlockJac
prob = Problem()
model = prob.model
model.add_subsystem('p1', IndepVarComp('x1', 1.0), promotes=['x1'])
model.add_subsystem('p2', IndepVarComp('x2', 1.0), promotes=['x2'])
cycle = model.add_subsystem('cycle', Group(), promotes=['*'])
parallel = cycle.add_subsystem('parallel', ParallelGroup(), promotes=['*'])
parallel.add_subsystem('c1', ExecComp(['y1=(-2.0*x1+z)/3']), promotes=['x1', 'y1', 'z'])
parallel.add_subsystem('c2', ExecComp(['y2=(5.0*x2-z)/6']), promotes=['x2', 'y2', 'z'])
cycle.add_subsystem('c3', ExecComp(['z=(3.0*y1+7.0*y2)/10']), promotes=['y1', 'y2', 'z'])
model.add_subsystem('c4', ExecComp(['z2 = y1+y2']), promotes=['z2', 'y1', 'y2'])
cycle.nonlinear_solver = NonlinearBlockJac()
prob.setup(mode='fwd')
prob.set_solver_print(level=2)
prob.run_model()
print(prob['z2'])
print(prob['z'])
if prob.model.comm.rank == 0:
print(prob['y1'])
if prob.model.comm.rank == 0:
print(prob['y2'])
Есть несколько незначительных проблем с этим.1) это означает, что ваш скрипт теперь отличается для последовательного и параллельного.2) Это раздражает.Таким образом, мы работаем над исправлением, которое позволит вещам работать более чисто, автоматически выполняя трансляцию MPI, когда вы пытаетесь получить значение, которого нет в вашем процессе.Это будет выпущено в V2.6.
Еще одна небольшая заметка.Я изменил ваш NL решатель на NonLinearBlockJac .Это для блока Якоби, который предназначен для параллельной работы.Вы также можете использовать решатель Ньютон параллельно. Решатель Гаусса-Зайделя на самом деле не позволит вам получить параллельное ускорение.