def testDerivatives(self): prob = Problem(root=Group()) root = prob.root root.add('pf', pf.PlantFinance(), promotes=['*']) prob.setup() for k in self.params.keys(): prob[k] = self.params[k] prob.check_total_derivatives()
def test_relevance_issue(self): p = Problem() p.root = Group() dvars = (('a', 3.), ('b', 10.)) p.root.add('desvars', IndepVarComp(dvars), promotes=['a', 'b']) sg = p.root.add('sg', Group(), promotes=["*"]) sg.add('si', SimpleImplicit(), promotes=['a', 'b', 'x']) p.root.add('func', ExecComp('f = 2*x0+a'), promotes=['f', 'x0', 'a']) p.root.connect('x', 'x0', src_indices=[1]) p.root.ln_solver = ScipyGMRES() p.root.ln_solver.preconditioner = LinearGaussSeidel() p.driver.add_objective('f') p.driver.add_desvar('a') p.setup(check=False) p.run_once() # Make sure we don't get a KeyError p.check_total_derivatives(out_stream=None)
def test_relevance_issue(self): p = Problem() p.root = Group() dvars = ( ('a', 3.), ('b', 10.)) p.root.add('desvars', IndepVarComp(dvars), promotes=['a', 'b']) sg = p.root.add('sg', Group(), promotes=["*"]) sg.add('si', SimpleImplicit(), promotes=['a', 'b', 'x']) p.root.add('func', ExecComp('f = 2*x0+a'), promotes=['f', 'x0', 'a']) p.root.connect('x', 'x0', src_indices=[1]) p.root.ln_solver = ScipyGMRES() p.root.ln_solver.preconditioner = LinearGaussSeidel() p.driver.add_objective('f') p.driver.add_desvar('a') p.setup(check=False) p.run_once() # Make sure we don't get a KeyError p.check_total_derivatives(out_stream=None)
def testDerivatives(self): prob = Problem(root=Group()) root = prob.root root.add('pf', pf.PlantFinance(), promotes=['*']) prob.setup() for k in self.params.keys(): prob[k] = self.params[k] prob.check_total_derivatives()
def test_check_derivs_param(self): class Comp(Component): def __init__(self): super(Comp, self).__init__() self.add_param('x', val=0.0) self.add_param('y', val=3, pass_by_obj=True) self.add_output('z', val=0.0) def solve_nonlinear(self, params, unknowns, resids): unknowns['z'] = params['y'] * params['x'] def linearize(self, params, unknowns, resids): J = {} J['z', 'x'] = params['y'] return J prob = Problem() prob.root = Group() prob.root.add('comp', Comp(), promotes=['*']) prob.root.add('p1', IndepVarComp('x', 0.0), promotes=['x']) prob.root.add('p2', IndepVarComp('y', 3, pass_by_obj=True), promotes=['y']) prob.setup(check=False) prob.run() data = prob.check_partial_derivatives(out_stream=None) self.assertEqual(data['comp'][('z', 'x')]['J_fwd'][0][0], 3.0) data = prob.check_total_derivatives(out_stream=None) self.assertEqual(data[('z', 'x')]['J_fwd'][0][0], 3.0)
def setUp(self): r0 = 10.0 depth = 30.0 G = 140e6 nu = 0.4 rigid = [False, False, False, False, False, False] prob = Problem() root = prob.root = Group() root.add('p1', IndepVarComp('r0', r0)) root.add('p2', IndepVarComp('depth', depth)) root.add('p', TowerSoil()) root.connect('p1.r0', 'p.r0') root.connect('p2.depth', 'p.depth') prob.driver.add_objective('p.k', scaler=1E-6) prob.driver.add_desvar('p1.r0', lower=0, upper=1000, scaler=1E-6) prob.driver.add_desvar('p2.depth', lower=0, upper=1000, scaler=1E-6) prob.setup() prob['p.G'] = G prob['p.nu'] = nu prob['p.rigid'] = rigid prob.run() self.J = prob.check_total_derivatives(out_stream=None) print self.J
def setUp(self): r0 = 10.0 depth = 30.0 G = 140e6 nu = 0.4 rigid = [False, False, False, False, False, False] prob = Problem() root = prob.root = Group() root.add('p1', IndepVarComp('r0', r0)) root.add('p2', IndepVarComp('depth', depth)) root.add('p', TowerSoil()) root.connect('p1.r0', 'p.r0') root.connect('p2.depth', 'p.depth') prob.driver.add_objective('p.k', scaler=1E-6) prob.driver.add_desvar('p1.r0', lower=0, upper=1000, scaler=1E-6) prob.driver.add_desvar('p2.depth', lower=0, upper=1000, scaler=1E-6) prob.setup() prob['p.G'] = G prob['p.nu'] = nu prob['p.rigid'] = rigid prob.run() self.J = prob.check_total_derivatives(out_stream=None) print self.J
def setUp(self): d0 = 10.0 depth = 30.0 G = 140e6 nu = 0.4 rigid = [False, False, False, False, False, False] prob = Problem() root = prob.model = Group() root.add_subsystem('p1', IndepVarComp('d0', d0, units='m')) root.add_subsystem('p2', IndepVarComp('depth', depth, units='m')) root.add_subsystem('p', TowerSoil()) root.connect('p1.d0', 'p.d0') root.connect('p2.depth', 'p.depth') prob.driver = ScipyOptimizeDriver() prob.model.add_objective('p.k', scaler=1E-6) prob.model.add_design_var('p1.d0', lower=0, upper=1000, scaler=1E-6) prob.model.add_design_var('p2.depth', lower=0, upper=1000, scaler=1E-6) prob.setup() prob['p.G'] = G prob['p.nu'] = nu prob.run_driver() self.J = prob.check_total_derivatives(out_stream=None) print(self.J)
def test_simple_implicit_check_options(self): prob = Problem() prob.root = Group() prob.root.ln_solver = ScipyGMRES() prob.root.add('comp', SimpleImplicitComp()) prob.root.add('p1', IndepVarComp('x', 0.5)) prob.root.connect('p1.x', 'comp.x') # Not using this prob.root.deriv_options['step_size'] = 1e4 # Using these prob.root.deriv_options['check_form'] = 'central' prob.root.deriv_options['check_step_size'] = 1e-3 prob.setup(check=False) prob.run() data = prob.check_total_derivatives(out_stream=None) for key, val in iteritems(data): assert_rel_error(self, val['abs error'][0], 0.0, 1e-5) assert_rel_error(self, val['abs error'][1], 0.0, 1e-5) assert_rel_error(self, val['abs error'][2], 0.0, 1e-5) assert_rel_error(self, val['rel error'][0], 0.0, 1e-5) assert_rel_error(self, val['rel error'][1], 0.0, 1e-5) assert_rel_error(self, val['rel error'][2], 0.0, 1e-5)
def test_check_totals_calls_run_once(self): prob = Problem() root = prob.root = Group() root.add('p1', IndepVarComp('x', 1.0), promotes=['*']) root.add('p2', IndepVarComp('y', 1.0), promotes=['*']) root.add('comp', Paraboloid(), promotes=['*']) prob.driver.add_desvar('x') prob.driver.add_desvar('y') prob.driver.add_objective('f_xy') prob.setup(check=False) prob['x'] = 5.0 prob['y'] = 2.0 iostream = StringIO() data = prob.check_total_derivatives(out_stream=iostream) self.assertAlmostEqual(first=prob["f_xy"], second= (prob['x']-3.0)**2 \ + prob['x']*prob['y'] \ + (prob['y']+4.0)**2 - 3.0, places=5, msg="check partial derivatives did not call" "run_once on the driver as expected.") self.assertEqual(first=iostream.getvalue()[:39], second="Executing model to populate unknowns...", msg="check partial derivatives failed to run driver once")
def test_check_totals_calls_run_once(self): prob = Problem() root = prob.root = Group() root.add('p1', IndepVarComp('x', 1.0), promotes=['*']) root.add('p2', IndepVarComp('y', 1.0), promotes=['*']) root.add('comp', Paraboloid(), promotes=['*']) prob.driver.add_desvar('x') prob.driver.add_desvar('y') prob.driver.add_objective('f_xy') prob.setup(check=False) prob['x'] = 5.0 prob['y'] = 2.0 iostream = StringIO() data = prob.check_total_derivatives(out_stream=iostream) self.assertAlmostEqual(first=prob["f_xy"], second= (prob['x']-3.0)**2 \ + prob['x']*prob['y'] \ + (prob['y']+4.0)**2 - 3.0, places=5, msg="check partial derivatives did not call" "run_once on the driver as expected.") self.assertEqual( first=iostream.getvalue()[:39], second="Executing model to populate unknowns...", msg="check partial derivatives failed to run driver once")
def test_check_derivs_param(self): class Comp(Component): def __init__(self): super(Comp, self).__init__() self.add_param('x', val=0.0) self.add_param('y', val=3, pass_by_obj=True) self.add_output('z', val=0.0) def solve_nonlinear(self, params, unknowns, resids): unknowns['z'] = params['y']*params['x'] def linearize(self, params, unknowns, resids): J = {} J['z', 'x'] = params['y'] return J prob = Problem() prob.root = Group() prob.root.add('comp', Comp(), promotes=['*']) prob.root.add('p1', IndepVarComp('x', 0.0), promotes=['x']) prob.root.add('p2', IndepVarComp('y', 3, pass_by_obj=True), promotes=['y']) prob.setup(check=False) prob.run() data = prob.check_partial_derivatives(out_stream=None) self.assertEqual(data['comp'][('z', 'x')]['J_fwd'][0][0], 3.0) data = prob.check_total_derivatives(out_stream=None) self.assertEqual(data[('z', 'x')]['J_fwd'][0][0], 3.0)
def test_simple_implicit(self): prob = Problem() prob.root = Group() prob.root.ln_solver = ScipyGMRES() prob.root.add('comp', SimpleImplicitComp()) prob.root.add('p1', IndepVarComp('x', 0.5)) prob.root.connect('p1.x', 'comp.x') prob.root.comp.deriv_options['check_type'] = 'cs' prob.setup(check=False) prob.run() # Correct total derivatives (we can do this one manually) J = prob.calc_gradient(['p1.x'], ['comp.y'], mode='fwd') assert_rel_error(self, J[0][0], -2.5555511, 1e-5) J = prob.calc_gradient(['p1.x'], ['comp.y'], mode='rev') assert_rel_error(self, J[0][0], -2.5555511, 1e-5) J = prob.calc_gradient(['p1.x'], ['comp.y'], mode='fd') assert_rel_error(self, J[0][0], -2.5555511, 1e-5) # Clean up old FD prob.run() # Partials data = prob.check_partial_derivatives(out_stream=None) #data = prob.check_partial_derivatives() for key1, val1 in iteritems(data): for key2, val2 in iteritems(val1): assert_rel_error(self, val2['abs error'][0], 0.0, 1e-5) assert_rel_error(self, val2['abs error'][1], 0.0, 1e-5) assert_rel_error(self, val2['abs error'][2], 0.0, 1e-5) assert_rel_error(self, val2['rel error'][0], 0.0, 1e-5) assert_rel_error(self, val2['rel error'][1], 0.0, 1e-5) assert_rel_error(self, val2['rel error'][2], 0.0, 1e-5) assert_rel_error(self, data['comp'][('y', 'x')]['J_fwd'][0][0], 1.0, 1e-6) assert_rel_error(self, data['comp'][('y', 'z')]['J_fwd'][0][0], 2.0, 1e-6) assert_rel_error(self, data['comp'][('z', 'x')]['J_fwd'][0][0], 2.66666667, 1e-6) assert_rel_error(self, data['comp'][('z', 'z')]['J_fwd'][0][0], 1.5, 1e-6) # Clean up old FD prob.run() # Make sure check_totals works too data = prob.check_total_derivatives(out_stream=None) for key1, val1 in iteritems(data): assert_rel_error(self, val1['abs error'][0], 0.0, 1e-5) assert_rel_error(self, val1['abs error'][1], 0.0, 1e-5) assert_rel_error(self, val1['abs error'][2], 0.0, 1e-5) assert_rel_error(self, val1['rel error'][0], 0.0, 1e-5) assert_rel_error(self, val1['rel error'][1], 0.0, 1e-5) assert_rel_error(self, val1['rel error'][2], 0.0, 1e-5)
def test_simple_implicit(self): prob = Problem() prob.root = Group() prob.root.ln_solver = ScipyGMRES() prob.root.add("comp", SimpleImplicitComp()) prob.root.add("p1", IndepVarComp("x", 0.5)) prob.root.connect("p1.x", "comp.x") prob.root.comp.fd_options["extra_check_partials_form"] = "complex_step" prob.setup(check=False) prob.run() # Correct total derivatives (we can do this one manually) J = prob.calc_gradient(["p1.x"], ["comp.y"], mode="fwd") assert_rel_error(self, J[0][0], -2.5555511, 1e-5) J = prob.calc_gradient(["p1.x"], ["comp.y"], mode="rev") assert_rel_error(self, J[0][0], -2.5555511, 1e-5) J = prob.calc_gradient(["p1.x"], ["comp.y"], mode="fd") assert_rel_error(self, J[0][0], -2.5555511, 1e-5) # Clean up old FD prob.run() # Partials data = prob.check_partial_derivatives(out_stream=None) # data = prob.check_partial_derivatives() for key1, val1 in iteritems(data): for key2, val2 in iteritems(val1): assert_rel_error(self, val2["abs error"][0], 0.0, 1e-5) assert_rel_error(self, val2["abs error"][1], 0.0, 1e-5) assert_rel_error(self, val2["abs error"][2], 0.0, 1e-5) assert_rel_error(self, val2["rel error"][0], 0.0, 1e-5) assert_rel_error(self, val2["rel error"][1], 0.0, 1e-5) assert_rel_error(self, val2["rel error"][2], 0.0, 1e-5) assert_rel_error(self, data["comp"][("y", "x")]["J_fwd"][0][0], 1.0, 1e-6) assert_rel_error(self, data["comp"][("y", "z")]["J_fwd"][0][0], 20.0, 1e-6) assert_rel_error(self, data["comp"][("z", "x")]["J_fwd"][0][0], 2.66666667, 1e-6) assert_rel_error(self, data["comp"][("z", "z")]["J_fwd"][0][0], 15.0, 1e-6) # Clean up old FD prob.run() # Make sure check_totals works too data = prob.check_total_derivatives(out_stream=None) for key1, val1 in iteritems(data): assert_rel_error(self, val1["abs error"][0], 0.0, 1e-5) assert_rel_error(self, val1["abs error"][1], 0.0, 1e-5) assert_rel_error(self, val1["abs error"][2], 0.0, 1e-5) assert_rel_error(self, val1["rel error"][0], 0.0, 1e-5) assert_rel_error(self, val1["rel error"][1], 0.0, 1e-5) assert_rel_error(self, val1["rel error"][2], 0.0, 1e-5)
def test_check_derivs_unknowns(self): class Comp1(Component): def __init__(self): super(Comp1, self).__init__() self.add_param('x', shape=1) self.add_output('y', shape=1) self.add_output('dz_dy', shape=1, pass_by_obj=True) def solve_nonlinear(self, params, unknowns, resids): x = params['x'] unknowns['y'] = 4.0*x + 1.0 unknowns['dz_dy'] = 2.0 def linearize(self, params, unknowns, resids): J = {} J['y', 'x'] = 4.0 return J class Comp2(Component): def __init__(self): super(Comp2, self).__init__() self.add_param('y', shape=1) self.add_param('dz_dy', shape=1, pass_by_obj=True) self.add_output('z', shape=1) def solve_nonlinear(self, params, unknowns, resids): y = params['y'] unknowns['z'] = y*2.0 def linearize(self, params, unknowns, resids): J = {} J['z', 'y'] = params['dz_dy'] return J class TestGroup(Group): def __init__(self): super(TestGroup, self).__init__() self.add('x', IndepVarComp('x', 0.0), promotes=['*']) self.add('c1', Comp1(), promotes=['*']) self.add('c2', Comp2(), promotes=['*']) prob = Problem() prob.root = TestGroup() prob.setup(check=False) prob['x'] = 2.0 prob.run() data = prob.check_partial_derivatives(out_stream=None) self.assertEqual(data['c1'][('y', 'x')]['J_fwd'][0][0], 4.0) self.assertEqual(data['c1'][('y', 'x')]['J_rev'][0][0], 4.0) self.assertEqual(data['c2'][('z', 'y')]['J_fwd'][0][0], 2.0) self.assertEqual(data['c2'][('z', 'y')]['J_rev'][0][0], 2.0) data = prob.check_total_derivatives(out_stream=None) self.assertEqual(data[('z', 'x')]['J_fwd'][0][0], 8.0)
def test_check_derivs_unknowns(self): class Comp1(Component): def __init__(self): super(Comp1, self).__init__() self.add_param('x', shape=1) self.add_output('y', shape=1) self.add_output('dz_dy', shape=1, pass_by_obj=True) def solve_nonlinear(self, params, unknowns, resids): x = params['x'] unknowns['y'] = 4.0 * x + 1.0 unknowns['dz_dy'] = 2.0 def linearize(self, params, unknowns, resids): J = {} J['y', 'x'] = 4.0 return J class Comp2(Component): def __init__(self): super(Comp2, self).__init__() self.add_param('y', shape=1) self.add_param('dz_dy', shape=1, pass_by_obj=True) self.add_output('z', shape=1) def solve_nonlinear(self, params, unknowns, resids): y = params['y'] unknowns['z'] = y * 2.0 def linearize(self, params, unknowns, resids): J = {} J['z', 'y'] = params['dz_dy'] return J class TestGroup(Group): def __init__(self): super(TestGroup, self).__init__() self.add('x', IndepVarComp('x', 0.0), promotes=['*']) self.add('c1', Comp1(), promotes=['*']) self.add('c2', Comp2(), promotes=['*']) prob = Problem() prob.root = TestGroup() prob.setup(check=False) prob['x'] = 2.0 prob.run() data = prob.check_partial_derivatives(out_stream=None) self.assertEqual(data['c1'][('y', 'x')]['J_fwd'][0][0], 4.0) self.assertEqual(data['c1'][('y', 'x')]['J_rev'][0][0], 4.0) self.assertEqual(data['c2'][('z', 'y')]['J_fwd'][0][0], 2.0) self.assertEqual(data['c2'][('z', 'y')]['J_rev'][0][0], 2.0) data = prob.check_total_derivatives(out_stream=None) self.assertEqual(data[('z', 'x')]['J_fwd'][0][0], 8.0)
def test_dido(self): prob = Problem(root=Group(), impl=impl, driver=ScipyOptimizer()) # Total horizontal space of area to be enclosed. x = 100.0 # Number of segments used to enclose area. n = 50 # Horizonal size of each segment dx = x / n prob.root.add(name='ys_ivc', system=IndepVarComp('ys', val=np.zeros(n), units='m'), promotes=['ys']) prob.root.add(name='rec_group', system=RectangleGroup(n, dx)) prob.root.add(name='total_area_comp', system=Summer(n), promotes=['total_area']) prob.root.add(name='perimeter_comp', system=PerimeterComp(n, dx), promotes=['ys', 'total_perimeter']) for i in range(n): prob.root.connect('ys', 'rec_group.section_{0}.y'.format(i), src_indices=[i]) prob.root.connect('rec_group.section_{0}.area'.format(i), 'total_area_comp.area_{0}'.format(i)) idxs = range(n)[1:-1] prob.driver.add_desvar('ys', lower=np.zeros(n - 2), indices=idxs) prob.driver.add_constraint('total_perimeter', upper=150) prob.driver.add_objective('total_area', scaler=-1.0E-3) prob.setup(check=False) prob.run() data = prob.check_total_derivatives(out_stream=None) for key, val in data.items(): assert_rel_error(self, val['abs error'][0], 0.0, 1e-5) assert_rel_error(self, val['abs error'][1], 0.0, 1e-5) assert_rel_error(self, val['abs error'][2], 0.0, 1e-5) assert_rel_error(self, val['rel error'][0], 0.0, 1e-5) assert_rel_error(self, val['rel error'][1], 0.0, 1e-5) assert_rel_error(self, val['rel error'][2], 0.0, 1e-5) assert_rel_error(self, 3574.94, prob['total_area'], 0.1)
def setUp(self): prob = Problem() root = prob.root = Group() root.add('nrel_csm_tcc_2015', nrel_csm_tcc_2015(), promotes=['*']) root.add('machine_rating', IndepVarComp('machine_rating', 5000.), promotes=['*']) prob.driver = pyOptSparseDriver() prob.driver.options['optimizer'] = 'SNOPT' obj = 'turbine_cost' #ROTOR MASS and ROTOR COST prob.driver.add_objective('%s' % obj) prob.driver.add_desvar('machine_rating') prob.setup() prob['rotor_diameter'] = 100.0 prob['turbine_class'] = 'II/III' prob['blade_has_carbon'] = True prob['blade_number'] = 3 # prob['machine_rating'] = 5000.0 prob['hub_height'] = 80.0 prob['bearing_number'] = 2 prob['crane'] = True # prob['offshore'] = False # Rotor force calculations for nacelle inputs maxTipSpd = 80.0 maxEfficiency = 0.9 ratedHubPower = prob['machine_rating'] * 1000. / maxEfficiency rotorSpeed = (maxTipSpd / (0.5 * prob['rotor_diameter'])) * (60.0 / (2. * np.pi)) prob['rotor_torque'] = ratedHubPower / (rotorSpeed * (np.pi / 30)) prob.run_once() self.J = prob.check_total_derivatives(out_stream=None) self.obj = obj print 'analytic: ' print self.J[('%s' % obj, 'machine_rating')]['J_fwd'] print 'fd: ' print self.J[('%s' % obj, 'machine_rating')]['J_fd']
def test_full_model_fd_double_diamond_grouped_par_sys(self): prob = Problem() root = prob.root = Group() par = root.add('par', ParallelGroup()) par.add('sub', ConvergeDivergeGroups()) prob.setup(check=False) prob.run() prob.root.fd_options['force_fd'] = True # Make sure we don't get a key error. data = prob.check_total_derivatives(out_stream=None)
def test_full_model_fd_double_diamond_grouped_par_sys(self): prob = Problem() root = prob.root = Group() par = root.add('par', ParallelGroup()) par.add('sub', ConvergeDivergeGroups()) prob.root.fd_options['force_fd'] = True prob.setup(check=False) prob.run() # Make sure we don't get a key error. data = prob.check_total_derivatives(out_stream=None)
def test_limit_to_desvar_obj_con(self): prob = Problem() root = prob.root = Group() root.add('p1', IndepVarComp('x', 1.0), promotes=['*']) root.add('comp', Paraboloid(), promotes=['*']) prob.driver.add_desvar('x') prob.driver.add_objective('f_xy') prob.setup(check=False) prob.run() data = prob.check_total_derivatives(out_stream=None) self.assertTrue(('f_xy', 'x') in data) self.assertTrue(('f_xy', 'y') not in data)
def test_limit_to_desvar_obj_con(self): prob = Problem() root = prob.root = Group() root.add('p1', IndepVarComp('x', 1.0), promotes=['*']) root.add('comp', Paraboloid(), promotes=['*']) prob.driver.add_desvar('x') prob.driver.add_objective('f_xy') prob.setup(check=False) prob.run() data = prob.check_total_derivatives(out_stream=None) self.assertTrue(('f_xy', 'x') in data) self.assertTrue(('f_xy', 'y') not in data)
def test_double_diamond_model(self): prob = Problem() prob.root = ConvergeDivergeGroups() prob.setup(check=False) prob.run() data = prob.check_total_derivatives(out_stream=None) for key, val in iteritems(data): assert_rel_error(self, val['abs error'][0], 0.0, 1e-5) assert_rel_error(self, val['abs error'][1], 0.0, 1e-5) assert_rel_error(self, val['abs error'][2], 0.0, 1e-5) assert_rel_error(self, val['rel error'][0], 0.0, 1e-5) assert_rel_error(self, val['rel error'][1], 0.0, 1e-5) assert_rel_error(self, val['rel error'][2], 0.0, 1e-5)
def test_double_diamond_model(self): prob = Problem() prob.root = ConvergeDivergeGroups() prob.setup(check=False) prob.run() data = prob.check_total_derivatives(out_stream=None) for key, val in iteritems(data): assert_rel_error(self, val['abs error'][0], 0.0, 1e-5) assert_rel_error(self, val['abs error'][1], 0.0, 1e-5) assert_rel_error(self, val['abs error'][2], 0.0, 1e-5) assert_rel_error(self, val['rel error'][0], 0.0, 1e-5) assert_rel_error(self, val['rel error'][1], 0.0, 1e-5) assert_rel_error(self, val['rel error'][2], 0.0, 1e-5)
def test_dido(self): prob = Problem(root=Group(), impl=impl, driver=pyOptSparseDriver()) # Total horizontal space of area to be enclosed. x = 100.0 # Number of segments used to enclose area. n = 50 # Horizonal size of each segment dx = x / n prob.root.add(name="ys_ivc", system=IndepVarComp("ys", val=np.zeros(n), units="m"), promotes=["ys"]) prob.root.add(name="rec_group", system=RectangleGroup(n, dx)) prob.root.add(name="total_area_comp", system=Summer(n), promotes=["total_area"]) prob.root.add(name="perimeter_comp", system=PerimeterComp(n, dx), promotes=["ys", "total_perimeter"]) for i in range(n): prob.root.connect("ys", "rec_group.section_{0}.y".format(i), src_indices=[i]) prob.root.connect("rec_group.section_{0}.area".format(i), "total_area_comp.area_{0}".format(i)) idxs = range(n)[1:-1] prob.driver.options["optimizer"] = OPTIMIZER prob.driver.options["print_results"] = False prob.driver.add_desvar("ys", lower=np.zeros(n - 2), indices=idxs) prob.driver.add_constraint("total_perimeter", upper=150) prob.driver.add_objective("total_area", scaler=-1.0e-3) prob.setup(check=False) prob.run() data = prob.check_total_derivatives(out_stream=None) for key, val in data.items(): assert_rel_error(self, val["abs error"][0], 0.0, 1e-5) assert_rel_error(self, val["abs error"][1], 0.0, 1e-5) assert_rel_error(self, val["abs error"][2], 0.0, 1e-5) assert_rel_error(self, val["rel error"][0], 0.0, 1e-5) assert_rel_error(self, val["rel error"][1], 0.0, 1e-5) assert_rel_error(self, val["rel error"][2], 0.0, 1e-5) assert_rel_error(self, 3574.94, prob["total_area"], 0.1)
def setUp(self): Uc = 7.0 z_surface = 20.0 hs = 10.0 T = 2.0 z_floor = 0.1 betaWave = 3.0 z = np.linspace(z_floor, z_surface, 20) nPoints = len(z) prob = Problem() root = prob.model = Group() root.add_subsystem('p1', IndepVarComp('z', z, units='m')) root.add_subsystem('p2', IndepVarComp('Uc', Uc, units='m/s')) root.add_subsystem('p', LinearWaves(nPoints=nPoints)) root.connect('p1.z', 'p.z') root.connect('p2.Uc', 'p.Uc') prob.driver = ScipyOptimizeDriver() prob.model.add_objective('p.U', scaler=1E-6) prob.model.add_design_var('p1.z', lower=np.ones(nPoints), upper=np.ones(nPoints) * 1000, scaler=1E-6) prob.model.add_design_var('p2.Uc', lower=0, upper=1000, scaler=1E-6) prob.setup() prob['p.z_surface'] = z_surface prob['p.z_floor'] = z_floor prob['p.hmax'] = hs prob['p.T'] = T #prob['p.betaWave'] = betaWave prob.run_driver() print(prob['p.U']) self.J = prob.check_total_derivatives(out_stream=None) print(self.J)
def test_with_relevance_rev(self): prob = Problem() prob.root = ConvergeDivergePar() prob.root.ln_solver = LinearGaussSeidel() prob.driver.add_desvar('p.x') prob.driver.add_objective('comp7.y1') prob.root.ln_solver.options['mode'] = 'rev' prob.root.ln_solver.options['single_voi_relevance_reduction'] = True prob.setup(check=False) prob.run() data = prob.check_total_derivatives(out_stream=None) for key, val in iteritems(data): assert_rel_error(self, val['abs error'][1], 0.0, 1e-5) assert_rel_error(self, val['rel error'][1], 0.0, 1e-5)
def test_with_relevance_rev(self): prob = Problem() prob.root = ConvergeDivergePar() prob.root.ln_solver = LinearGaussSeidel() prob.driver.add_desvar('p.x') prob.driver.add_objective('comp7.y1') prob.root.ln_solver.options['mode'] = 'rev' prob.root.ln_solver.options['single_voi_relevance_reduction'] = True prob.setup(check=False) prob.run() data = prob.check_total_derivatives(out_stream=None) for key, val in iteritems(data): assert_rel_error(self, val['abs error'][1], 0.0, 1e-5) assert_rel_error(self, val['rel error'][1], 0.0, 1e-5)
def setUp(self): self.rtol = 1E-5 self.atol = 1E-5 hub_cost = np.random.rand(1) * 150000. + 100000. pitch_system_cost = np.random.rand(1) * 150000. + 100000. spinner_cost = np.random.rand(1) * 150000. + 100000. prob = Problem() root = prob.root = Group() root.add('hub_cost', IndepVarComp('hub_cost', float(hub_cost)), promotes=['*']) root.add('pitch_system_cost', IndepVarComp('pitch_system_cost', float(pitch_system_cost)), promotes=['*']) root.add('spinner_cost', IndepVarComp('spinner_cost', float(spinner_cost)), promotes=['*']) root.add('HubSystemCostAdder2015', HubSystemCostAdder2015(), promotes=['*']) # set up optimizer prob.driver = pyOptSparseDriver() prob.driver.options['optimizer'] = 'SNOPT' prob.driver.add_objective('hub_system_cost') # select design variables prob.driver.add_desvar('hub_cost') prob.driver.add_desvar('pitch_system_cost') prob.driver.add_desvar('spinner_cost') # initialize problem prob.setup() # run problem prob.run_once() # pass results to self for use with unit test self.J = prob.check_total_derivatives(out_stream=None)
def setUp(self): Uc = 7.0 z_surface = 20.0 hs = 10.0 T = 2.0 z_floor = 0.1 betaWave = 3.0 z = np.linspace(z_floor, z_surface, 20) nPoints = len(z) prob = Problem() root = prob.root = Group() root.add('p1', IndepVarComp('z', z)) root.add('p2', IndepVarComp('Uc', Uc)) root.add('p', LinearWaves(nPoints)) root.connect('p1.z', 'p.z') root.connect('p2.Uc', 'p.Uc') prob.driver.add_objective('p.U', scaler=1E-6) prob.driver.add_desvar('p1.z', lower=np.ones(nPoints), upper=np.ones(nPoints) * 1000, scaler=1E-6) prob.driver.add_desvar('p2.Uc', lower=0, upper=1000, scaler=1E-6) prob.setup() prob['p.z_surface'] = z_surface prob['p.z_floor'] = z_floor prob['p.hmax'] = hs prob['p.T'] = T prob['p.betaWave'] = betaWave prob.run() print prob['p.U'] self.J = prob.check_total_derivatives(out_stream=None) print self.J
def setUp(self): z = np.linspace(0.0, 100.0, 20) nPoints = len(z) Uref = 10.0 zref = 100.0 z0 = 0.001 #Fails when z0 = 0, What to do here? shearExp = 0.2 betaWind = 0.0 prob = Problem() root = prob.model = Group() root.add_subsystem('p1', IndepVarComp('z', z, units='m')) root.add_subsystem('p2', IndepVarComp('zref', zref, units='m')) root.add_subsystem('p3', IndepVarComp('Uref', Uref, units='m/s')) root.add_subsystem('p', PowerWind(nPoints=nPoints)) root.connect('p1.z', 'p.z') root.connect('p2.zref', 'p.zref') root.connect('p3.Uref', 'p.Uref') prob.driver = ScipyOptimizeDriver() prob.model.add_objective('p.U', scaler=1E-6) prob.model.add_design_var('p1.z', lower=np.ones(nPoints), upper=np.ones(nPoints) * 1000, scaler=1E-6) prob.model.add_design_var('p2.zref', lower=0, upper=1000, scaler=1E-6) prob.model.add_design_var('p3.Uref', lower=0, upper=1000, scaler=1E-6) prob.setup() prob['p.z0'] = z0 prob['p.shearExp'] = shearExp #prob['p.betaWind'] = betaWind prob.run_driver() print(prob['p.U']) self.J = prob.check_total_derivatives(out_stream=None)
def test_full_model_fd_simple_comp_promoted(self): prob = Problem() prob.root = Group() sub = prob.root.add('sub', Group(), promotes=['*']) sub.add('comp', SimpleCompDerivMatVec(), promotes=['*']) prob.root.add('p1', IndepVarComp('x', 1.0), promotes=['*']) prob.setup(check=False) prob.run() data = prob.check_total_derivatives(out_stream=None) for key, val in iteritems(data): assert_rel_error(self, val['abs error'][0], 0.0, 1e-5) assert_rel_error(self, val['abs error'][1], 0.0, 1e-5) assert_rel_error(self, val['abs error'][2], 0.0, 1e-5) assert_rel_error(self, val['rel error'][0], 0.0, 1e-5) assert_rel_error(self, val['rel error'][1], 0.0, 1e-5) assert_rel_error(self, val['rel error'][2], 0.0, 1e-5)
def test_full_model_fd_simple_comp_promoted(self): prob = Problem() prob.root = Group() sub = prob.root.add("sub", Group(), promotes=["*"]) sub.add("comp", SimpleCompDerivMatVec(), promotes=["*"]) prob.root.add("p1", IndepVarComp("x", 1.0), promotes=["*"]) prob.setup(check=False) prob.run() data = prob.check_total_derivatives(out_stream=None) for key, val in iteritems(data): assert_rel_error(self, val["abs error"][0], 0.0, 1e-5) assert_rel_error(self, val["abs error"][1], 0.0, 1e-5) assert_rel_error(self, val["abs error"][2], 0.0, 1e-5) assert_rel_error(self, val["rel error"][0], 0.0, 1e-5) assert_rel_error(self, val["rel error"][1], 0.0, 1e-5) assert_rel_error(self, val["rel error"][2], 0.0, 1e-5)
def test_full_model_fd_simple_comp_promoted(self): prob = Problem() prob.root = Group() sub = prob.root.add('sub', Group(), promotes=['*']) sub.add('comp', SimpleCompDerivMatVec(), promotes=['*']) prob.root.add('p1', IndepVarComp('x', 1.0), promotes=['*']) prob.setup(check=False) prob.run() data = prob.check_total_derivatives(out_stream=None) for key, val in iteritems(data): assert_rel_error(self, val['abs error'][0], 0.0, 1e-5) assert_rel_error(self, val['abs error'][1], 0.0, 1e-5) assert_rel_error(self, val['abs error'][2], 0.0, 1e-5) assert_rel_error(self, val['rel error'][0], 0.0, 1e-5) assert_rel_error(self, val['rel error'][1], 0.0, 1e-5) assert_rel_error(self, val['rel error'][2], 0.0, 1e-5)
def setUp(self): z = np.linspace(0.0, 100.0, 20) nPoints = len(z) Uref = 10.0 zref = 100.0 z0 = 0.001 #Fails when z0 = 0, What to do here? shearExp = 0.2 betaWind = 0.0 prob = Problem() root = prob.root = Group() root.add('p1', IndepVarComp('z', z)) root.add('p2', IndepVarComp('zref', zref)) root.add('p3', IndepVarComp('Uref', Uref)) root.add('p', PowerWind(nPoints)) root.connect('p1.z', 'p.z') root.connect('p2.zref', 'p.zref') root.connect('p3.Uref', 'p.Uref') prob.driver.add_objective('p.U', scaler=1E-6) prob.driver.add_desvar('p1.z', lower=np.ones(nPoints), upper=np.ones(nPoints) * 1000, scaler=1E-6) prob.driver.add_desvar('p2.zref', lower=0, upper=1000, scaler=1E-6) prob.driver.add_desvar('p3.Uref', lower=0, upper=1000, scaler=1E-6) prob.setup() prob['p.z0'] = z0 prob['p.shearExp'] = shearExp prob['p.betaWind'] = betaWind prob.run() print prob['p.U'] self.J = prob.check_total_derivatives(out_stream=None)
def test_simple_implicit(self): prob = Problem() prob.root = Group() prob.root.add('comp', SimpleImplicitComp()) prob.root.add('p1', IndepVarComp('x', 0.5)) prob.root.connect('p1.x', 'comp.x') prob.setup(check=False) prob.run() data = prob.check_total_derivatives(out_stream=None) for key, val in iteritems(data): assert_rel_error(self, val['abs error'][0], 0.0, 1e-5) assert_rel_error(self, val['abs error'][1], 0.0, 1e-5) assert_rel_error(self, val['abs error'][2], 0.0, 1e-5) assert_rel_error(self, val['rel error'][0], 0.0, 1e-5) assert_rel_error(self, val['rel error'][1], 0.0, 1e-5) assert_rel_error(self, val['rel error'][2], 0.0, 1e-5)
def setUp(self): Uc = 7.0 z_surface = 20.0 hs = 10.0 T = 2.0 z_floor = 0.1 betaWave = 3.0 z = np.linspace(z_floor, z_surface, 20) nPoints = len(z) prob = Problem() root = prob.root = Group() root.add('p1', IndepVarComp('z', z)) root.add('p2', IndepVarComp('Uc', Uc)) root.add('p', LinearWaves(nPoints)) root.connect('p1.z', 'p.z') root.connect('p2.Uc', 'p.Uc') prob.driver.add_objective('p.U', scaler=1E-6) prob.driver.add_desvar('p1.z', lower=np.ones(nPoints), upper=np.ones(nPoints)*1000, scaler=1E-6) prob.driver.add_desvar('p2.Uc', lower=0, upper=1000, scaler=1E-6) prob.setup() prob['p.z_surface'] = z_surface prob['p.z_floor'] = z_floor prob['p.hmax'] = hs prob['p.T'] = T prob['p.betaWave'] = betaWave prob.run() print prob['p.U'] self.J = prob.check_total_derivatives(out_stream=None) print self.J
def test_simple_implicit(self): prob = Problem() prob.root = Group() prob.root.ln_solver = ScipyGMRES() prob.root.add("comp", SimpleImplicitComp()) prob.root.add("p1", IndepVarComp("x", 0.5)) prob.root.connect("p1.x", "comp.x") prob.setup(check=False) prob.run() data = prob.check_total_derivatives(out_stream=None) for key, val in iteritems(data): assert_rel_error(self, val["abs error"][0], 0.0, 1e-5) assert_rel_error(self, val["abs error"][1], 0.0, 1e-5) assert_rel_error(self, val["abs error"][2], 0.0, 1e-5) assert_rel_error(self, val["rel error"][0], 0.0, 1e-5) assert_rel_error(self, val["rel error"][1], 0.0, 1e-5) assert_rel_error(self, val["rel error"][2], 0.0, 1e-5)
def test_simple_implicit(self): prob = Problem() prob.root = Group() prob.root.ln_solver = ScipyGMRES() prob.root.add('comp', SimpleImplicitComp()) prob.root.add('p1', IndepVarComp('x', 0.5)) prob.root.connect('p1.x', 'comp.x') prob.setup(check=False) prob.run() data = prob.check_total_derivatives(out_stream=None) for key, val in iteritems(data): assert_rel_error(self, val['abs error'][0], 0.0, 1e-5) assert_rel_error(self, val['abs error'][1], 0.0, 1e-5) assert_rel_error(self, val['abs error'][2], 0.0, 1e-5) assert_rel_error(self, val['rel error'][0], 0.0, 1e-5) assert_rel_error(self, val['rel error'][1], 0.0, 1e-5) assert_rel_error(self, val['rel error'][2], 0.0, 1e-5)
def setUp(self): z = np.linspace(0.0, 100.0, 20) nPoints = len(z) Uref = 10.0 zref = 100.0 z0 = 0.001 #Fails when z0 = 0, What to do here? shearExp = 0.2 betaWind = 0.0 prob = Problem() root = prob.root = Group() root.add('p1', IndepVarComp('z', z)) root.add('p2', IndepVarComp('zref', zref)) root.add('p3', IndepVarComp('Uref', Uref)) root.add('p', PowerWind(nPoints)) root.connect('p1.z', 'p.z') root.connect('p2.zref', 'p.zref') root.connect('p3.Uref', 'p.Uref') prob.driver.add_objective('p.U', scaler=1E-6) prob.driver.add_desvar('p1.z', lower=np.ones(nPoints), upper=np.ones(nPoints)*1000, scaler=1E-6) prob.driver.add_desvar('p2.zref', lower=0, upper=1000, scaler=1E-6) prob.driver.add_desvar('p3.Uref', lower=0, upper=1000, scaler=1E-6) prob.setup() prob['p.z0'] = z0 prob['p.shearExp'] = shearExp prob['p.betaWind'] = betaWind prob.run() print prob['p.U'] self.J = prob.check_total_derivatives(out_stream=None)
def test_basic(self): top = Problem() root = top.root = Group() root.add("p", IndepVarComp("x", 2000.0)) root.add("comp1", BasicComp()) root.add("comp2", ExecComp(["y = 2.0*x"])) root.connect("p.x", "comp1.x") root.connect("comp1.y", "comp2.x") top.driver.add_desvar("p.x", 2000.0) top.driver.add_objective("comp2.y") root.comp1.fd_options["extra_check_partials_form"] = "complex_step" top.setup(check=False) top.run() # correct execution, scale does not affect downstream output assert_rel_error(self, top["comp2.y"], 12000.0, 1e-6) # in-component query is unscaled assert_rel_error(self, root.comp1.store_y, 6000.0, 1e-6) # afterwards direct query is unscaled assert_rel_error(self, root.unknowns["comp1.y"], 6000.0, 1e-6) # OpenMDAO behind-the-scenes query is scaled # (So, internal storage is scaled) assert_rel_error(self, root.unknowns._dat["comp1.y"].val, 6.0, 1e-6) # Correct derivatives J = top.calc_gradient(["p.x"], ["comp2.y"], mode="fwd") assert_rel_error(self, J[0][0], 6.0, 1e-6) J = top.calc_gradient(["p.x"], ["comp2.y"], mode="rev") assert_rel_error(self, J[0][0], 6.0, 1e-6) J = top.calc_gradient(["p.x"], ["comp2.y"], mode="fd") assert_rel_error(self, J[0][0], 6.0, 1e-6) # Clean up old FD top.run() # Make sure check_partials works too data = top.check_partial_derivatives(out_stream=None) # data = top.check_partial_derivatives() for key1, val1 in iteritems(data): for key2, val2 in iteritems(val1): assert_rel_error(self, val2["abs error"][0], 0.0, 1e-5) assert_rel_error(self, val2["abs error"][1], 0.0, 1e-5) assert_rel_error(self, val2["abs error"][2], 0.0, 1e-5) assert_rel_error(self, val2["rel error"][0], 0.0, 1e-5) assert_rel_error(self, val2["rel error"][1], 0.0, 1e-5) assert_rel_error(self, val2["rel error"][2], 0.0, 1e-5) # Clean up old FD top.run() # Make sure check_totals works too data = top.check_total_derivatives(out_stream=None) for key1, val1 in iteritems(data): assert_rel_error(self, val1["abs error"][0], 0.0, 1e-5) assert_rel_error(self, val1["abs error"][1], 0.0, 1e-5) assert_rel_error(self, val1["abs error"][2], 0.0, 1e-5) assert_rel_error(self, val1["rel error"][0], 0.0, 1e-5) assert_rel_error(self, val1["rel error"][1], 0.0, 1e-5) assert_rel_error(self, val1["rel error"][2], 0.0, 1e-5)
def test_converge_diverge(self): from openmdao.test.converge_diverge import Comp1, Comp2, Comp3, Comp5, Comp6, Comp7 class Comp4(Component): def __init__(self): super(Comp4, self).__init__() self.add_param("x1", 1.0) self.add_param("x2", 1.0) self.add_output("y1", 1.0, scaler=3.0) self.add_output("y2", 1.0, scaler=2.0) def solve_nonlinear(self, params, unknowns, resids): """ Runs the component.""" unknowns["y1"] = params["x1"] + 2.0 * params["x2"] unknowns["y2"] = 3.0 * params["x1"] - 5.0 * params["x2"] def linearize(self, params, unknowns, resids): """Returns the Jacobian.""" J = {} J[("y1", "x1")] = 1.0 J[("y1", "x2")] = 2.0 J[("y2", "x1")] = 3.0 J[("y2", "x2")] = -5.0 return J class ConvergeDiverge(Group): """ Topology one - two - one - two - one. This model was critical in testing parallel reverse scatters.""" def __init__(self): super(ConvergeDiverge, self).__init__() self.add("p", IndepVarComp("x", 2.0)) self.add("comp1", Comp1()) self.add("comp2", Comp2()) self.add("comp3", Comp3()) self.add("comp4", Comp4()) self.add("comp5", Comp5()) self.add("comp6", Comp6()) self.add("comp7", Comp7()) self.connect("p.x", "comp1.x1") self.connect("comp1.y1", "comp2.x1") self.connect("comp1.y2", "comp3.x1") self.connect("comp2.y1", "comp4.x1") self.connect("comp3.y1", "comp4.x2") self.connect("comp4.y1", "comp5.x1") self.connect("comp4.y2", "comp6.x1") self.connect("comp5.y1", "comp7.x1") self.connect("comp6.y1", "comp7.x2") prob = Problem() prob.root = ConvergeDiverge() prob.setup(check=False) prob.run() # Partials data = prob.check_partial_derivatives(out_stream=None) # data = prob.check_partial_derivatives() for key1, val1 in iteritems(data): for key2, val2 in iteritems(val1): assert_rel_error(self, val2["abs error"][0], 0.0, 1e-5) assert_rel_error(self, val2["abs error"][1], 0.0, 1e-5) assert_rel_error(self, val2["abs error"][2], 0.0, 1e-5) assert_rel_error(self, val2["rel error"][0], 0.0, 1e-5) assert_rel_error(self, val2["rel error"][1], 0.0, 1e-5) assert_rel_error(self, val2["rel error"][2], 0.0, 1e-5) # Clean up old FD prob.run() # Make sure check_totals works too data = prob.check_total_derivatives(out_stream=None) for key1, val1 in iteritems(data): assert_rel_error(self, val1["abs error"][0], 0.0, 1e-5) assert_rel_error(self, val1["abs error"][1], 0.0, 1e-5) assert_rel_error(self, val1["abs error"][2], 0.0, 1e-5) assert_rel_error(self, val1["rel error"][0], 0.0, 1e-5) assert_rel_error(self, val1["rel error"][1], 0.0, 1e-5) assert_rel_error(self, val1["rel error"][2], 0.0, 1e-5)
def setUp(self): # --- geometry ---- # --- geometry ---- z_param = np.array([0.0, 43.8, 87.6]) d_param = np.array([6.0, 4.935, 3.87]) t_param = np.array([0.027 * 1.3, 0.023 * 1.3, 0.019 * 1.3]) n = 15 z_full = np.linspace(0.0, 87.6, n) L_reinforced = 30.0 * np.ones(n) # [m] buckling length theta_stress = 0.0 * np.ones(n) yaw = 0.0 # --- material props --- E = 210e9 * np.ones(n) G = 80.8e9 * np.ones(n) rho = 8500.0 * np.ones(n) sigma_y = 450.0e6 * np.ones(n) # --- spring reaction data. Use float('inf') for rigid constraints. --- kidx = np.array([0], dtype=int) # applied at base kx = np.array([float('inf')]) ky = np.array([float('inf')]) kz = np.array([float('inf')]) ktx = np.array([float('inf')]) kty = np.array([float('inf')]) ktz = np.array([float('inf')]) nK = len(kidx) # --- extra mass ---- midx = np.array([n - 1], dtype=int) # RNA mass at top m = np.array([285598.8]) mIxx = np.array([1.14930678e+08]) mIyy = np.array([2.20354030e+07]) mIzz = np.array([1.87597425e+07]) mIxy = np.array([0.00000000e+00]) mIxz = np.array([5.03710467e+05]) mIyz = np.array([0.00000000e+00]) mrhox = np.array([-1.13197635]) mrhoy = np.array([0.]) mrhoz = np.array([0.50875268]) nMass = len(midx) addGravityLoadForExtraMass = True # ----------- # --- wind --- wind_zref = 90.0 wind_z0 = 0.0 shearExp = 0.2 # --------------- # if addGravityLoadForExtraMass=True be sure not to double count by adding those force here also # # --- loading case 1: max Thrust --- wind_Uref1 = 11.73732 plidx1 = np.array([n - 1], dtype=int) # at top Fx1 = np.array([1284744.19620519]) Fy1 = np.array([0.]) Fz1 = np.array([-2914124.84400512]) Mxx1 = np.array([3963732.76208099]) Myy1 = np.array([-2275104.79420872]) Mzz1 = np.array([-346781.68192839]) nPL = len(plidx1) # # --------------- # # --- loading case 2: max wind speed --- wind_Uref2 = 70.0 plidx2 = np.array([n - 1], dtype=int) # at top Fx2 = np.array([930198.60063279]) Fy2 = np.array([0.]) Fz2 = np.array([-2883106.12368949]) Mxx2 = np.array([-1683669.22411597]) Myy2 = np.array([-2522475.34625363]) Mzz2 = np.array([147301.97023764]) # # --------------- # --- safety factors --- gamma_f = 1.35 gamma_m = 1.3 gamma_n = 1.0 gamma_b = 1.1 # --------------- # --- fatigue --- z_DEL = np.array([ 0.000, 1.327, 3.982, 6.636, 9.291, 11.945, 14.600, 17.255, 19.909, 22.564, 25.218, 27.873, 30.527, 33.182, 35.836, 38.491, 41.145, 43.800, 46.455, 49.109, 51.764, 54.418, 57.073, 59.727, 62.382, 65.036, 67.691, 70.345, 73.000, 75.655, 78.309, 80.964, 83.618, 86.273, 87.600 ]) M_DEL = 1e3 * np.array([ 8.2940E+003, 8.1518E+003, 7.8831E+003, 7.6099E+003, 7.3359E+003, 7.0577E+003, 6.7821E+003, 6.5119E+003, 6.2391E+003, 5.9707E+003, 5.7070E+003, 5.4500E+003, 5.2015E+003, 4.9588E+003, 4.7202E+003, 4.4884E+003, 4.2577E+003, 4.0246E+003, 3.7942E+003, 3.5664E+003, 3.3406E+003, 3.1184E+003, 2.8977E+003, 2.6811E+003, 2.4719E+003, 2.2663E+003, 2.0673E+003, 1.8769E+003, 1.7017E+003, 1.5479E+003, 1.4207E+003, 1.3304E+003, 1.2780E+003, 1.2673E+003, 1.2761E+003 ]) nDEL = len(z_DEL) gamma_fatigue = 1.35 * 1.3 * 1.0 life = 20.0 m_SN = 4 # --------------- # --- constraints --- min_d_to_t = 120.0 min_taper = 0.4 # --------------- # # V_max = 80.0 # tip speed # # D = 126.0 # # .freq1p = V_max / (D/2) / (2*pi) # convert to Hz nPoints = len(z_param) nFull = len(z_full) wind = 'PowerWind' prob = Problem() root = prob.root = Group() prob.driver = pyOptSparseDriver() prob.driver.options['optimizer'] = 'SNOPT' prob.driver.opt_settings['Major iterations limit'] = 1000 root.add('z_param', IndepVarComp('z_param', z_param)) root.add('d_param', IndepVarComp('d_param', d_param)) root.add('t_param', IndepVarComp('t_param', t_param)) root.add('TowerSE', TowerSE(nPoints, nFull, nK, nMass, nPL, nDEL, wind=wind)) prob.driver.add_objective('TowerSE.tower1.mass', scaler=1E-6) prob.driver.add_desvar('z_param.z_param', lower=np.zeros(nPoints), upper=np.ones(nPoints) * 1000., scaler=1E-2) prob.driver.add_desvar('t_param.t_param', lower=np.ones(nPoints) * 0.001, upper=np.ones(nPoints) * 1000., scaler=1E-6) prob.driver.add_desvar('d_param.d_param', np.array([2, 2.1, 2.2]), upper=np.ones(nPoints) * 1000., scaler=1E-6) prob.root.connect('z_param.z_param', 'TowerSE.z_param') prob.root.connect('d_param.d_param', 'TowerSE.d_param') prob.root.connect('t_param.t_param', 'TowerSE.t_param') prob.driver.add_constraint('TowerSE.tower1.stress', upper=np.ones(n)) prob.driver.add_constraint('TowerSE.tower2.stress', upper=np.ones(n)) prob.driver.add_constraint('TowerSE.tower1.global_buckling', upper=np.ones(n)) prob.driver.add_constraint('TowerSE.tower2.global_buckling', upper=np.ones(n)) prob.driver.add_constraint('TowerSE.tower1.shell_buckling', upper=np.ones(n)) prob.driver.add_constraint('TowerSE.tower2.shell_buckling', upper=np.ones(n)) prob.driver.add_constraint('TowerSE.tower1.damage', upper=np.ones(n) * 0.8) prob.driver.add_constraint('TowerSE.gc.weldability', upper=np.zeros(n)) prob.driver.add_constraint('TowerSE.gc.manufacturability', upper=np.zeros(n)) freq1p = 0.2 # 1P freq in Hz prob.driver.add_constraint('TowerSE.tower1.f1', lower=1.1 * freq1p) prob.driver.add_constraint('TowerSE.tower2.f1', lower=1.1 * freq1p) prob.setup() if wind == 'PowerWind': prob['TowerSE.wind1.shearExp'] = shearExp prob['TowerSE.wind2.shearExp'] = shearExp # assign values to params # --- geometry ---- #prob['TowerSE.z_param'] = z_param #prob['TowerSE.d_param'] = d_param #prob['TowerSE.t_param'] = t_param prob['TowerSE.z_full'] = z_full prob['TowerSE.tower1.L_reinforced'] = L_reinforced prob['TowerSE.distLoads1.yaw'] = yaw # --- material props --- prob['TowerSE.tower1.E'] = E prob['TowerSE.tower1.G'] = G prob['TowerSE.tower1.rho'] = rho prob['TowerSE.tower1.sigma_y'] = sigma_y # --- spring reaction data. Use float('inf') for rigid constraints. --- prob['TowerSE.tower1.kidx'] = kidx prob['TowerSE.tower1.kx'] = kx prob['TowerSE.tower1.ky'] = ky prob['TowerSE.tower1.kz'] = kz prob['TowerSE.tower1.ktx'] = ktx prob['TowerSE.tower1.kty'] = kty prob['TowerSE.tower1.ktz'] = ktz # --- extra mass ---- prob['TowerSE.tower1.midx'] = midx prob['TowerSE.tower1.m'] = m prob['TowerSE.tower1.mIxx'] = mIxx prob['TowerSE.tower1.mIyy'] = mIyy prob['TowerSE.tower1.mIzz'] = mIzz prob['TowerSE.tower1.mIxy'] = mIxy prob['TowerSE.tower1.mIxz'] = mIxz prob['TowerSE.tower1.mIyz'] = mIyz prob['TowerSE.tower1.mrhox'] = mrhox prob['TowerSE.tower1.mrhoy'] = mrhoy prob['TowerSE.tower1.mrhoz'] = mrhoz prob[ 'TowerSE.tower1.addGravityLoadForExtraMass'] = addGravityLoadForExtraMass # ----------- # --- wind --- prob['TowerSE.wind1.zref'] = wind_zref prob['TowerSE.wind1.z0'] = wind_z0 # --------------- # # --- loading case 1: max Thrust --- prob['TowerSE.wind1.Uref'] = wind_Uref1 prob['TowerSE.tower1.plidx'] = plidx1 prob['TowerSE.tower1.Fx'] = Fx1 prob['TowerSE.tower1.Fy'] = Fy1 prob['TowerSE.tower1.Fz'] = Fz1 prob['TowerSE.tower1.Mxx'] = Mxx1 prob['TowerSE.tower1.Myy'] = Myy1 prob['TowerSE.tower1.Mzz'] = Mzz1 # # --------------- # # --- loading case 2: max Wind Speed --- prob['TowerSE.wind2.Uref'] = wind_Uref2 prob['TowerSE.tower2.plidx'] = plidx2 prob['TowerSE.tower2.Fx'] = Fx2 prob['TowerSE.tower2.Fy'] = Fy2 prob['TowerSE.tower2.Fz'] = Fz2 prob['TowerSE.tower2.Mxx'] = Mxx2 prob['TowerSE.tower2.Myy'] = Myy2 prob['TowerSE.tower2.Mzz'] = Mzz2 # # --------------- # --- safety factors --- prob['TowerSE.tower1.gamma_f'] = gamma_f prob['TowerSE.tower1.gamma_m'] = gamma_m prob['TowerSE.tower1.gamma_n'] = gamma_n prob['TowerSE.tower1.gamma_b'] = gamma_b # --------------- # --- fatigue --- prob['TowerSE.tower1.z_DEL'] = z_DEL prob['TowerSE.tower1.M_DEL'] = M_DEL prob['TowerSE.tower1.gamma_fatigue'] = gamma_fatigue prob['TowerSE.tower1.life'] = life prob['TowerSE.tower1.m_SN'] = m_SN # --------------- # --- constraints --- prob['TowerSE.gc.min_d_to_t'] = min_d_to_t prob['TowerSE.gc.min_taper'] = min_taper # --------------- # # --- run --- prob.run() print prob['TowerSE.gc.weldability'] print prob['TowerSE.gc.manufacturability'] self.J = prob.check_total_derivatives(out_stream=None) """
root = prob.root = Group() root.add('p1', PowerWind(nPoints)) prob.setup() prob['p1.z'] = z prob['p1.Uref'] = 10.0 prob['p1.zref'] = 100.0 prob['p1.z0'] = 1.0 prob['p1.shearExp'] = 0.2 prob.run() J = prob.check_total_derivatives(out_stream=None) print(J) #print(prob['p1.z']) import matplotlib.pyplot as plt plt.figure(1) plt.plot(prob['p1.z'], prob['p1.U'], label='Power') z = np.linspace(1.0, 5, 100) nPoints = len(z) prob = Problem()
root = prob.model = Group() root.add('p1', PowerWind(nPoints=nPoints)) prob.setup() prob['p1.z'] = z prob['p1.Uref'] = 10.0 prob['p1.zref'] = 100.0 prob['p1.z0'] = 1.0 prob['p1.shearExp'] = 0.2 prob.run_driver() J = prob.check_total_derivatives(out_stream=None) print(J) #print(prob['p1.z']) import matplotlib.pyplot as plt plt.figure(1) plt.plot(prob['p1.z'], prob['p1.U'], label='Power') z = np.linspace(1.0, 5, 100) nPoints = len(z) prob = Problem() root = prob.model = Group() root.add('p1', LogWind(nPoints))
def setUp(self): # --- geometry ---- # --- geometry ---- z_param = np.array([0.0, 43.8, 87.6]) d_param = np.array([6.0, 4.935, 3.87]) t_param = np.array([0.027*1.3, 0.023*1.3, 0.019*1.3]) n = 15 z_full = np.linspace(0.0, 87.6, n) L_reinforced = 30.0*np.ones(n) # [m] buckling length theta_stress = 0.0*np.ones(n) yaw = 0.0 # --- material props --- E = 210e9*np.ones(n) G = 80.8e9*np.ones(n) rho = 8500.0*np.ones(n) sigma_y = 450.0e6*np.ones(n) # --- spring reaction data. Use float('inf') for rigid constraints. --- kidx = np.array([0], dtype=int) # applied at base kx = np.array([float('inf')]) ky = np.array([float('inf')]) kz = np.array([float('inf')]) ktx = np.array([float('inf')]) kty = np.array([float('inf')]) ktz = np.array([float('inf')]) nK = len(kidx) # --- extra mass ---- midx = np.array([n-1], dtype=int) # RNA mass at top m = np.array([285598.8]) mIxx = np.array([1.14930678e+08]) mIyy = np.array([2.20354030e+07]) mIzz = np.array([1.87597425e+07]) mIxy = np.array([0.00000000e+00]) mIxz = np.array([5.03710467e+05]) mIyz = np.array([0.00000000e+00]) mrhox = np.array([-1.13197635]) mrhoy = np.array([0.]) mrhoz = np.array([0.50875268]) nMass = len(midx) addGravityLoadForExtraMass = True # ----------- # --- wind --- wind_zref = 90.0 wind_z0 = 0.0 shearExp = 0.2 # --------------- # if addGravityLoadForExtraMass=True be sure not to double count by adding those force here also # # --- loading case 1: max Thrust --- wind_Uref1 = 11.73732 plidx1 = np.array([n-1], dtype=int) # at top Fx1 = np.array([1284744.19620519]) Fy1 = np.array([0.]) Fz1 = np.array([-2914124.84400512]) Mxx1 = np.array([3963732.76208099]) Myy1 = np.array([-2275104.79420872]) Mzz1 = np.array([-346781.68192839]) nPL = len(plidx1) # # --------------- # # --- loading case 2: max wind speed --- wind_Uref2 = 70.0 plidx2 = np.array([n-1], dtype=int) # at top Fx2 = np.array([930198.60063279]) Fy2 = np.array([0.]) Fz2 = np.array([-2883106.12368949]) Mxx2 = np.array([-1683669.22411597]) Myy2 = np.array([-2522475.34625363]) Mzz2 = np.array([147301.97023764]) # # --------------- # --- safety factors --- gamma_f = 1.35 gamma_m = 1.3 gamma_n = 1.0 gamma_b = 1.1 # --------------- # --- fatigue --- z_DEL = np.array([0.000, 1.327, 3.982, 6.636, 9.291, 11.945, 14.600, 17.255, 19.909, 22.564, 25.218, 27.873, 30.527, 33.182, 35.836, 38.491, 41.145, 43.800, 46.455, 49.109, 51.764, 54.418, 57.073, 59.727, 62.382, 65.036, 67.691, 70.345, 73.000, 75.655, 78.309, 80.964, 83.618, 86.273, 87.600]) M_DEL = 1e3*np.array([8.2940E+003, 8.1518E+003, 7.8831E+003, 7.6099E+003, 7.3359E+003, 7.0577E+003, 6.7821E+003, 6.5119E+003, 6.2391E+003, 5.9707E+003, 5.7070E+003, 5.4500E+003, 5.2015E+003, 4.9588E+003, 4.7202E+003, 4.4884E+003, 4.2577E+003, 4.0246E+003, 3.7942E+003, 3.5664E+003, 3.3406E+003, 3.1184E+003, 2.8977E+003, 2.6811E+003, 2.4719E+003, 2.2663E+003, 2.0673E+003, 1.8769E+003, 1.7017E+003, 1.5479E+003, 1.4207E+003, 1.3304E+003, 1.2780E+003, 1.2673E+003, 1.2761E+003]) nDEL = len(z_DEL) gamma_fatigue = 1.35*1.3*1.0 life = 20.0 m_SN = 4 # --------------- # --- constraints --- min_d_to_t = 120.0 min_taper = 0.4 # --------------- # # V_max = 80.0 # tip speed # # D = 126.0 # # .freq1p = V_max / (D/2) / (2*pi) # convert to Hz nPoints = len(z_param) nFull = len(z_full) wind = 'PowerWind' prob = Problem() root = prob.root = Group() prob.driver = pyOptSparseDriver() prob.driver.options['optimizer'] = 'SNOPT' prob.driver.opt_settings['Major iterations limit'] = 1000 root.add('z_param', IndepVarComp('z_param', z_param)) root.add('d_param', IndepVarComp('d_param', d_param)) root.add('t_param', IndepVarComp('t_param', t_param)) root.add('TowerSE', TowerSE(nPoints, nFull, nK, nMass, nPL, nDEL, wind=wind)) prob.driver.add_objective('TowerSE.tower1.mass', scaler=1E-6) prob.driver.add_desvar('z_param.z_param', lower=np.zeros(nPoints), upper=np.ones(nPoints)*1000., scaler=1E-2) prob.driver.add_desvar('t_param.t_param', lower=np.ones(nPoints)*0.001, upper=np.ones(nPoints)*1000., scaler=1E-6) prob.driver.add_desvar('d_param.d_param', np.array([2,2.1,2.2]), upper=np.ones(nPoints)*1000., scaler=1E-6) prob.root.connect('z_param.z_param', 'TowerSE.z_param') prob.root.connect('d_param.d_param', 'TowerSE.d_param') prob.root.connect('t_param.t_param', 'TowerSE.t_param') prob.driver.add_constraint('TowerSE.tower1.stress', upper=np.ones(n)) prob.driver.add_constraint('TowerSE.tower2.stress', upper=np.ones(n)) prob.driver.add_constraint('TowerSE.tower1.global_buckling', upper=np.ones(n)) prob.driver.add_constraint('TowerSE.tower2.global_buckling', upper=np.ones(n)) prob.driver.add_constraint('TowerSE.tower1.shell_buckling', upper=np.ones(n)) prob.driver.add_constraint('TowerSE.tower2.shell_buckling', upper=np.ones(n)) prob.driver.add_constraint('TowerSE.tower1.damage', upper=np.ones(n)*0.8) prob.driver.add_constraint('TowerSE.gc.weldability', upper=np.zeros(n)) prob.driver.add_constraint('TowerSE.gc.manufacturability', upper=np.zeros(n)) freq1p = 0.2 # 1P freq in Hz prob.driver.add_constraint('TowerSE.tower1.f1', lower=1.1*freq1p) prob.driver.add_constraint('TowerSE.tower2.f1', lower=1.1*freq1p) prob.setup() if wind=='PowerWind': prob['TowerSE.wind1.shearExp'] = shearExp prob['TowerSE.wind2.shearExp'] = shearExp # assign values to params # --- geometry ---- #prob['TowerSE.z_param'] = z_param #prob['TowerSE.d_param'] = d_param #prob['TowerSE.t_param'] = t_param prob['TowerSE.z_full'] = z_full prob['TowerSE.tower1.L_reinforced'] = L_reinforced prob['TowerSE.distLoads1.yaw'] = yaw # --- material props --- prob['TowerSE.tower1.E'] = E prob['TowerSE.tower1.G'] = G prob['TowerSE.tower1.rho'] = rho prob['TowerSE.tower1.sigma_y'] = sigma_y # --- spring reaction data. Use float('inf') for rigid constraints. --- prob['TowerSE.tower1.kidx'] = kidx prob['TowerSE.tower1.kx'] = kx prob['TowerSE.tower1.ky'] = ky prob['TowerSE.tower1.kz'] = kz prob['TowerSE.tower1.ktx'] = ktx prob['TowerSE.tower1.kty'] = kty prob['TowerSE.tower1.ktz'] = ktz # --- extra mass ---- prob['TowerSE.tower1.midx'] = midx prob['TowerSE.tower1.m'] = m prob['TowerSE.tower1.mIxx'] = mIxx prob['TowerSE.tower1.mIyy'] = mIyy prob['TowerSE.tower1.mIzz'] = mIzz prob['TowerSE.tower1.mIxy'] = mIxy prob['TowerSE.tower1.mIxz'] = mIxz prob['TowerSE.tower1.mIyz'] = mIyz prob['TowerSE.tower1.mrhox'] = mrhox prob['TowerSE.tower1.mrhoy'] = mrhoy prob['TowerSE.tower1.mrhoz'] = mrhoz prob['TowerSE.tower1.addGravityLoadForExtraMass'] = addGravityLoadForExtraMass # ----------- # --- wind --- prob['TowerSE.wind1.zref'] = wind_zref prob['TowerSE.wind1.z0'] = wind_z0 # --------------- # # --- loading case 1: max Thrust --- prob['TowerSE.wind1.Uref'] = wind_Uref1 prob['TowerSE.tower1.plidx'] = plidx1 prob['TowerSE.tower1.Fx'] = Fx1 prob['TowerSE.tower1.Fy'] = Fy1 prob['TowerSE.tower1.Fz'] = Fz1 prob['TowerSE.tower1.Mxx'] = Mxx1 prob['TowerSE.tower1.Myy'] = Myy1 prob['TowerSE.tower1.Mzz'] = Mzz1 # # --------------- # # --- loading case 2: max Wind Speed --- prob['TowerSE.wind2.Uref'] = wind_Uref2 prob['TowerSE.tower2.plidx'] = plidx2 prob['TowerSE.tower2.Fx'] = Fx2 prob['TowerSE.tower2.Fy'] = Fy2 prob['TowerSE.tower2.Fz'] = Fz2 prob['TowerSE.tower2.Mxx'] = Mxx2 prob['TowerSE.tower2.Myy'] = Myy2 prob['TowerSE.tower2.Mzz'] = Mzz2 # # --------------- # --- safety factors --- prob['TowerSE.tower1.gamma_f'] = gamma_f prob['TowerSE.tower1.gamma_m'] = gamma_m prob['TowerSE.tower1.gamma_n'] = gamma_n prob['TowerSE.tower1.gamma_b'] = gamma_b # --------------- # --- fatigue --- prob['TowerSE.tower1.z_DEL'] = z_DEL prob['TowerSE.tower1.M_DEL'] = M_DEL prob['TowerSE.tower1.gamma_fatigue'] = gamma_fatigue prob['TowerSE.tower1.life'] = life prob['TowerSE.tower1.m_SN'] = m_SN # --------------- # --- constraints --- prob['TowerSE.gc.min_d_to_t'] = min_d_to_t prob['TowerSE.gc.min_taper'] = min_taper # --------------- # # --- run --- prob.run() print prob['TowerSE.gc.weldability'] print prob['TowerSE.gc.manufacturability'] self.J = prob.check_total_derivatives(out_stream=None) """