def test_fd_options_step_type(self):
        class ScaledParaboloid(Component):
            """ Evaluates the equation f(x,y) = (x-3)^2 + xy + (y+4)^2 - 3 """
            def __init__(self):
                super(ScaledParaboloid, self).__init__()

                # Params
                self.add_param('x', 1.0)
                self.add_param('y', 1.0)

                # Unknowns
                self.add_output('f_xy', 0.0)

                self.scale = 1.0e-6

            def solve_nonlinear(self, params, unknowns, resids):
                """f(x,y) = (x-3)^2 + xy + (y+4)^2 - 3
                Optimal solution (minimum): x = 6.6667; y = -7.3333
                """

                x = params['x']
                y = params['y']

                f_xy = ((x - 3.0)**2 + x * y + (y + 4.0)**2 - 3.0)
                unknowns['f_xy'] = self.scale * f_xy

            def jacobian(self, params, unknowns, resids):
                """Analytical derivatives"""

                x = params['x']
                y = params['y']
                J = {}

                J['f_xy', 'x'] = (2.0 * x - 6.0 + y) * self.scale
                J['f_xy', 'y'] = (2.0 * y + 8.0 + x) * self.scale

                return J

        prob = Problem()
        prob.root = Group()
        comp = prob.root.add('comp', ScaledParaboloid())
        prob.root.add('p1', ParamComp('x', 8.0 * comp.scale))
        prob.root.add('p2', ParamComp('y', 8.0 * comp.scale))
        prob.root.connect('p1.x', 'comp.x')
        prob.root.connect('p2.y', 'comp.y')

        comp.fd_options['force_fd'] = True
        comp.fd_options['step_type'] = 'absolute'

        prob.setup(check=False)
        prob.run()

        J1 = prob.calc_gradient(['p1.x'], ['comp.f_xy'], return_format='dict')

        comp.fd_options['step_type'] = 'relative'
        J2 = prob.calc_gradient(['p1.x'], ['comp.f_xy'], return_format='dict')

        # Couldnt put together a case where one is much worse, so just make sure they
        # are not equal.
        self.assertNotEqual(self, J1['comp.f_xy']['p1.x'][0][0],
                            J2['comp.f_xy']['p1.x'][0][0])
Exemplo n.º 2
0
def example():

    config = {'blade': 'seam', 'tower': 'seam'}

    turbine = FUSEDTurbineCostsModel(config)
    prob = Problem(turbine)
    prob.setup()

    prob['rotor_diameter'] = 126.0
    prob['blade_number'] = 3
    prob['machine_rating'] = 5000.0
    prob['hub_height'] = 90.0
    prob['bearing_number'] = 2
    prob['crane'] = True
    prob['offshore'] = False

    # Rotor force calculations for nacelle inputs
    maxTipSpd = 80.0
    maxEfficiency = 0.90

    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))

    # other inputs
    prob['machine_rating'] = 5000.0
    prob['blade_number'] = 3
    prob['crane'] = True
    prob['offshore'] = True
    prob['bearing_number'] = 2

    if config['blade'] == 'csm':
        prob['turbine_class'] = 1
        prob['blade_has_carbon'] = False
    else:
        prob['tsr'] = 8.0
        prob['rated_power'] = 5.
        prob['max_tipspeed'] = 62.
        prob['min_wsp'] = 0.
        prob['max_wsp'] = 25.
        prob['project_lifetime'] = 20.

    if config['blade'] == 'seam' or config['tower'] == 'seam':
        # loads inputs
        prob['Iref'] = 0.16
        prob['F'] = 0.777
        prob['wohler_exponent_blade_flap'] = 10.0
        prob['wohler_exponent_tower'] = 4.
        prob['nSigma4fatFlap'] = 1.2
        prob['nSigma4fatTower'] = 0.8
        prob['dLoad_dU_factor_flap'] = 0.9
        prob['dLoad_dU_factor_tower'] = 0.8
        prob['lifetime_cycles'] = 1.0e07
        prob['EdgeExtDynFact'] = 2.5
        prob['EdgeFatDynFact'] = 0.75
        prob['WeibullInput'] = True
        prob['WeiA_input'] = 11.
        prob['WeiC_input'] = 2.00
        prob['Nsections'] = 21
        prob['lifetime_cycles'] = 1e7
        prob['wohler_exponent_blade_flap'] = 10.0
        prob['PMtarget'] = 1.0

    if config['blade'] == 'seam':
        prob['MaxChordrR'] = 0.2
        prob['TIF_FLext'] = 1.
        prob['TIF_EDext'] = 1.
        prob['TIF_FLfat'] = 1.
        prob['sc_frac_flap'] = 0.3
        prob['sc_frac_edge'] = 0.8
        prob['SF_blade'] = 1.1
        prob['Slim_ext_blade'] = 200.0
        prob['Slim_fat_blade'] = 27
        prob['AddWeightFactorBlade'] = 1.2
        prob['blade_density'] = 2100.

    if config['tower'] == 'seam':
        prob['tower_bottom_diameter'] = 6.
        prob['tower_top_diameter'] = 3.78
        prob['wohler_exponent_tower'] = 4.
        prob['stress_limit_extreme_tower'] = 235.0
        prob['stress_limit_fatigue_tower'] = 14.885
        prob['safety_factor_tower'] = 1.5

    return prob