def test_data_pass_bounds_idx(self): p = Problem() p.root = Group() p.root.add('lower', ExecComp('low = 2*a'), promotes=['low', 'a']) p.root.add('upper', ExecComp('high = 2*b'), promotes=['high', 'b']) sub = p.root.add('sub', Group(), promotes=['x', 'low', 'high']) sub.add('comp', IndexCompTest(), promotes=['a', 'x', 'n', 'b', 'c']) sub.add('dummy1', ExecComp('d=low'), promotes=['low']) sub.add('dummy2', ExecComp('d=high'), promotes=['high']) sub.nl_solver = Brent() sub.nl_solver.options['state_var'] = 'x' sub.nl_solver.options['state_var_idx'] = 2 sub.nl_solver.options['var_lower_bound'] = 'low' sub.nl_solver.options['var_upper_bound'] = 'high' sub.ln_solver = ScipyGMRES() p.setup(check=False) p['a'] = -5. p['b'] = 55. p.run() assert_rel_error(self, p.root.unknowns['x'][2], 110, .0001)
def __init__(self, npower, nspline): super(RegulatedPowerCurveGroup, self).__init__() self.add('powercurve_comp', RegulatedPowerCurve(npower, nspline), promotes=['*']) self.nl_solver = Brent() self.ln_solver = ScipyGMRES() self.nl_solver.options['var_lower_bound'] = 'powercurve.control:Vin' self.nl_solver.options['var_upper_bound'] = 'powercurve.control:Vout' self.nl_solver.options['state_var'] = 'Vrated' self.deriv_options['form'] = 'central' self.deriv_options['type'] = 'fd' self.deriv_options['step_calc'] = 'relative'
def __init__(self): super(Combined, self).__init__() self.add('p1', CompPart1(), promotes=['*']) self.add('p2', CompPart2(), promotes=['*']) # self.add('i1', IndepVarComp('a', 1.), promotes=['*']) # self.add('i2', IndepVarComp('b', 1.), promotes=['*']) # self.nl_solver = Newton() self.nl_solver = Brent() self.nl_solver.options['state_var'] = 'x' self.ln_solver = ScipyGMRES() self.set_order(('p1','p2'))
def test_brent_converge_index(self): p = Problem() p.root = Group() p.root.add('comp', IndexCompTest(), promotes=['a', 'x', 'n', 'b', 'c']) p.root.nl_solver = Brent() p.root.nl_solver.options['state_var'] = 'x' p.root.nl_solver.options['state_var_idx'] = 2 p.root.ln_solver = ScipyGMRES() p.setup(check=False) p.run() assert_rel_error(self, p.root.unknowns['x'][2], 2.06720359226, .0001) assert_rel_error(self, p.root.resids['x'][2], 0, .0001)
def test_bracket(self): p = Problem() p.root = Group() p.root.add('comp', BracketTestComponent(), promotes=['phi', 'a', 'ap', 'lambda_r']) p.root.nl_solver = Brent() p.root.ln_solver = ScipyGMRES() eps = 1e-6 p.root.nl_solver.options['lower_bound'] = eps p.root.nl_solver.options['upper_bound'] = np.pi / 2 - eps p.root.nl_solver.options['state_var'] = 'phi' # def resize(lower, upper, iter): # if lower == eps and upper == np.pi/2 - eps: # return -np.pi/4, -eps, True # elif lower == -np.pi/4 and upper == -eps: # return np.pi/2+eps, np.pi-eps, True # else: # return lower, upper, False # p.root.nl_solver.f_resize_bracket = resize p.setup(check=False) p.run() # manually compute the right answer def manual_f(phi, params): r = np.sin(phi) / (1 - p['a']) - np.cos(phi) / p['lambda_r'] / ( 1 + p['ap']) # print phi, p['a'], p['lambda_r'], 1+p['ap'], r return r # run manually phi_star = brentq(manual_f, eps, np.pi / 2 - eps, args=(p.root.params, )) assert_rel_error(self, p.root.unknowns['phi'], phi_star, 1e-10)
def test_data_pass_bounds(self): p = Problem() p.root = Group() p.root.add('lower', ExecComp('low = 2*a'), promotes=['low', 'a']) p.root.add('upper', ExecComp('high = 2*b'), promotes=['high', 'b']) sub = p.root.add('sub', Group(), promotes=['x', 'low', 'high']) sub.add('comp', CompTest(), promotes=['a', 'x', 'n', 'b', 'c']) sub.add('dummy1', ExecComp('d=low'), promotes=['low']) sub.add('dummy2', ExecComp('d=high'), promotes=['high']) sub.nl_solver = Brent() sub.nl_solver.options['state_var'] = 'x' # sub.nl_solver.options['lower_bound'] = -10. # sub.nl_solver.options['upper_bound'] = 110. sub.nl_solver.options[ 'var_lower_bound'] = 'flow' # bad value for testing error sub.nl_solver.options['var_upper_bound'] = 'high' try: p.setup(check=False) except ValueError as err: self.assertEqual( str(err), "'var_lower_bound' variable 'flow' was not found as a parameter on any component in sub" ) else: self.fail('ValueError expected') sub.ln_solver = ScipyGMRES() sub.nl_solver.options['var_lower_bound'] = 'low' # correct value p.setup(check=False) p['a'] = -5. p['b'] = 55. p.run() assert_rel_error(self, p.root.unknowns['x'], 110, .0001)
def common_configure(group, varspeed, varpitch, npower): regulated = varspeed or varpitch # add components group.add('geom', GeomtrySetupBase()) if varspeed: group.add('setup', SetupRunVarSpeed(npower)) else: group.add('setup', SetupRunFixedSpeed()) group.add('analysis', AeroBase()) group.add('dt', DrivetrainLossesBase()) if varspeed or varpitch: group.add('powercurve', RegulatedPowerCurve(npower)) group.add('brent', Brent()) group.brent.workflow.add(['powercurve']) else: group.add('powercurve', UnregulatedPowerCurve(npower)) group.add('cdf', CDFBase()) group.add('aep', AEP()) if regulated: group.driver.workflow.add( ['geom', 'setup', 'analysis', 'dt', 'brent', 'cdf', 'aep']) else: group.driver.workflow.add( ['geom', 'setup', 'analysis', 'dt', 'powercurve', 'cdf', 'aep']) # connections to setup group.connect('control', 'setup.control') group.connect('npts_coarse_power_curve', 'setup.npts') if varspeed: group.connect('geom.R', 'setup.R') # connections to analysis group.connect('setup.Uhub', 'analysis.Uhub') group.connect('setup.Omega', 'analysis.Omega') group.connect('setup.pitch', 'analysis.pitch') group.analysis.run_case = 'power' # connections to drivetrain group.connect('analysis.P', 'dt.aeroPower') group.connect('analysis.Q', 'dt.aeroTorque') group.connect('analysis.T', 'dt.aeroThrust') group.connect('control:ratedPower', 'dt.ratedPower') # connections to powercurve group.connect('control', 'powercurve.control') group.connect('setup.Uhub', 'powercurve.Vcoarse') group.connect('dt.power', 'powercurve.Pcoarse') group.connect('analysis.T', 'powercurve.Tcoarse') group.connect('npts_spline_power_curve', 'powercurve.npts') if regulated: group.connect('geom.R', 'powercurve.R') # setup Brent method to find rated speed group.connect('control:Vin', 'brent.lower_bound') group.connect('control:Vout', 'brent.upper_bound') group.brent.add_parameter('powercurve.Vrated', low=-1e-15, high=1e15) group.brent.add_constraint('powercurve.residual = 0') group.brent.invalid_bracket_return = 1.0 # connections to cdf group.connect('powercurve.V', 'cdf.x') # connections to aep group.connect('cdf.F', 'aep.CDF_V') group.connect('powercurve.P', 'aep.P') group.connect('AEP_loss_factor', 'aep.lossFactor') # connections to outputs group.connect('powercurve.V', 'V') group.connect('powercurve.P', 'P') group.connect('aep.AEP', 'AEP') group.connect('2*geom.R', 'diameter') if regulated: group.connect('powercurve.ratedConditions', 'ratedConditions')
def setUp(self): p = Problem() p.root = Group() p.root.add('comp', CompTest(), promotes=['a', 'x', 'n', 'b', 'c']) p.root.nl_solver = Brent() self.prob = p