Начиная с OpenMDAO v2.4 вы не могли делать параллельные конечно-разностные.Однако эта функция была недавно добавлена в основную ветку OpenMDAO и скоро будет официально выпущена в OpenMDAO V2.5.
Чтобы использовать эту функцию прямо сейчас, установите версию репозитория openMDAO (Вы не можете сделать pip install openmdao
. Вместо этого клонируйте репозиторий из github, а затем pip install -e <location of the cloned repo>
).
Тогда вы можетеследуйте инструкциям на странице документации для параллельного FD.
Вот ваш реальный код.Единственное изменение в компоненте заключается в том, что когда вы создаете его экземпляр, вы предоставляете компоненту num_par_fd=5
аргумент.Затем, когда вы вызываете файл, вы должны запустить его под mpi следующим образом:
mpiexec -n 5 python test.py
Вот как должен выглядеть test.py:
import numpy as np
from openmdao.api import Problem, ScipyOptimizeDriver, ExecComp, IndepVarComp, ExplicitComponent, Group
class WorkFlow(ExplicitComponent):
def setup(self):
self.add_input('x', np.ones(5))
self.add_output('y', 2.0)
self.declare_partials('y', 'x', method='fd')
def compute(self, inputs, outputs):
print('comm:', self.comm.rank, inputs['x'])
print()
outputs['y'] = abs(np.sum(inputs['x']**2) - 9)
prob = Problem()
indeps = prob.model.add_subsystem('indeps', IndepVarComp(), promotes=['*'])
indeps.add_output('x', np.ones(5))
prob.model.add_subsystem('wf', WorkFlow(num_par_fd=5), promotes_inputs=['x'])
prob.driver = ScipyOptimizeDriver()
prob.driver.options['optimizer'] = 'SLSQP'
prob.driver.options['tol'] = 1e-9
prob.model.add_design_var('x', lower=-10.0, upper=10.0)
prob.model.add_objective('wf.y')
prob.setup()
prob.run_driver()
print(prob['x'])
print(prob['wf.y'])