Skip to content

Instantly share code, notes, and snippets.

@bbrelje
Last active April 16, 2020 20:26
Show Gist options
  • Save bbrelje/b6ac496b96c1ce1d393226078314d25d to your computer and use it in GitHub Desktop.
Save bbrelje/b6ac496b96c1ce1d393226078314d25d to your computer and use it in GitHub Desktop.
import openmdao.api as om
import numpy as np
from openmdao.utils.array_utils import evenly_distrib_idxs
N = 3
class DistribComp(om.ExplicitComponent):
def initialize(self):
self.options['distributed'] = True
def setup(self):
self.add_input('x', shape=1)
rank = self.comm.rank
sizes, offsets = evenly_distrib_idxs(self.comm.size, N)
self.add_output('y', shape=sizes[rank])
self.declare_partials('y', 'x')
def compute(self, inputs, outputs):
rank = self.comm.rank
sizes, offsets = evenly_distrib_idxs(self.comm.size, N)
outputs['y'] = inputs['x']*np.ones((sizes[rank],))
def compute_partials(self, inputs, J):
rank = self.comm.rank
sizes, offsets = evenly_distrib_idxs(self.comm.size, N)
J['y','x'] = 1.0
class GroupThatDoesNotWork(om.Group):
def setup(self):
dvs = om.IndepVarComp()
dvs.add_output('x', val=6.0)
self.add_subsystem('dvs', dvs, promotes_outputs=['*'])
self.add_subsystem('distcomp',DistribComp(), promotes_inputs=['*'])
self.add_design_var('x', lower=0.0, upper=10.0, scaler=1.0)
self.add_constraint('distcomp.y', lower=4.2, scaler=1.0)
self.add_objective('x')
class GroupThatDoesWork(om.Group):
def setup(self):
dvs = om.IndepVarComp()
dvs.add_output('x', val=6.0)
self.add_subsystem('dvs', dvs, promotes_outputs=['*'])
self.add_subsystem('distcomp',DistribComp(), promotes_inputs=['*'])
# simply adding an execcomp passthru fixes the problem
self.add_subsystem('execcomp',om.ExecComp('z = y', y=np.zeros((N,)), z=np.zeros((N,))))
self.connect('distcomp.y', 'execcomp.y')
self.add_design_var('x', lower=0.0, upper=10.0, scaler=1.0)
self.add_constraint('execcomp.z', lower=4.2, scaler=1.0)
self.add_objective('x')
if __name__ == "__main__":
prob = om.Problem()
prob.model = GroupThatDoesNotWork()
# prob.model = GroupThatDoesWork()
prob.driver = om.pyOptSparseDriver()
prob.driver.options['optimizer'] = "SLSQP"
# prob.driver.opt_settings ={
# 'Major feasibility tolerance': 1e-10, #1e-4,
# 'Major optimality tolerance': 1e-10, #1e-8,
# # 'Verify level': 0,
# 'Major iterations limit':200,
# 'Minor iterations limit':1000000,
# 'Iterations limit':1500000,
# 'Nonderivative linesearch':None,
# 'Major step limit': 0.01,
# # 'Function precision':1.0e-8,
# # 'Difference interval':1.0e-6,
# # 'Hessian full memory':None,
# 'Hessian frequency' : 200,
# #'Linesearch tolerance':0.99,
# 'Print file':'SNOPT_print.out',
# 'Summary file': 'SNOPT_summary.out',
# 'Problem Type':'Minimize',
# #'New superbasics limit':500,
# 'Penalty parameter':1.0}
prob.setup(mode='fwd')
prob['dvs.x'] = 7.0
prob.run_model()
# print(prob['distcomp.y'])
# print(prob['execcomp.z'])
# prob.check_partials(compact_print=True)
# prob.check_totals(compact_print=True)
prob.run_driver()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment