Example #1
0
    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)
Example #2
0
    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'
Example #3
0
    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'))
Example #4
0
    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)
Example #5
0
    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)
Example #6
0
    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)
Example #7
0
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')
Example #8
0
 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