Example #1
0
    def test2(self):

        rna = RNAMass()
        rna.blades_mass = np.random.rand(1)[0]
        rna.hub_mass = np.random.rand(1)[0]
        rna.nac_mass = np.random.rand(1)[0]
        rna.hub_cm = np.random.rand(3)
        rna.nac_cm = np.random.rand(3)
        rna.blades_I = np.random.rand(6)
        rna.hub_I = np.random.rand(6)
        rna.nac_I = np.random.rand(6)

        check_gradient_unit_test(self, rna)
Example #2
0
    def test1(self):

        rna = RNAMass()
        rna.blades_mass = 15241.323 * 3
        rna.hub_mass = 50421.4
        rna.nac_mass = 221245.8
        rna.hub_cm = [-6.3, 0., 3.15]
        rna.nac_cm = [-0.32, 0., 2.4]
        rna.blades_I = [26375976., 13187988., 13187988., 0., 0., 0.]
        rna.hub_I = [127297.8, 127297.8, 127297.8, 0., 0., 0.]
        rna.nac_I = [9908302.58, 912488.28, 1160903.54, 0., 0., 0.]

        check_gradient_unit_test(self, rna, tol=1e-5)
    def test2(self):

        rna = RNAMass()
        rna.blades_mass = np.random.rand(1)[0]
        rna.hub_mass = np.random.rand(1)[0]
        rna.nac_mass = np.random.rand(1)[0]
        rna.hub_cm = np.random.rand(3)
        rna.nac_cm = np.random.rand(3)
        rna.blades_I = np.random.rand(6)
        rna.hub_I = np.random.rand(6)
        rna.nac_I = np.random.rand(6)

        check_gradient_unit_test(self, rna)
    def test1(self):

        rna = RNAMass()
        rna.blades_mass = 15241.323 * 3
        rna.hub_mass = 50421.4
        rna.nac_mass = 221245.8
        rna.hub_cm = [-6.3, 0., 3.15]
        rna.nac_cm = [-0.32, 0., 2.4]
        rna.blades_I = [26375976., 13187988., 13187988., 0., 0., 0.]
        rna.hub_I = [127297.8, 127297.8, 127297.8, 0., 0., 0.]
        rna.nac_I = [9908302.58, 912488.28, 1160903.54, 0., 0., 0.]

        check_gradient_unit_test(self, rna, tol=1e-5)
Example #5
0
def configure_turbine_with_jacket(assembly,
                                  with_new_nacelle=False,
                                  flexible_blade=False,
                                  with_3pt_drive=False):
    """a stand-alone configure method to allow for flatter assemblies

    Parameters
    ----------
    assembly : Assembly
        an openmdao assembly to be configured
    with_new_nacelle : bool
        False uses the default implementation, True uses an experimental implementation designed
        to smooth out discontinities making in amenable for gradient-based optimization
    flexible_blade : bool
        if True, internally solves the coupled aero/structural deflection using fixed point iteration.
        Note that the coupling is currently only in the flapwise deflection, and is primarily
        only important for highly flexible blades.  If False, the aero loads are passed
        to the structure but there is no further iteration.
    """

    # --- general turbine configuration inputs---
    assembly.add(
        'rho',
        Float(1.225,
              iotype='in',
              units='kg/m**3',
              desc='density of air',
              deriv_ignore=True))
    assembly.add(
        'mu',
        Float(1.81206e-5,
              iotype='in',
              units='kg/m/s',
              desc='dynamic viscosity of air',
              deriv_ignore=True))
    assembly.add(
        'shear_exponent',
        Float(0.2, iotype='in', desc='shear exponent', deriv_ignore=True))
    assembly.add('hub_height',
                 Float(90.0, iotype='in', units='m', desc='hub height'))
    assembly.add(
        'turbine_class',
        Enum('I', ('I', 'II', 'III'), iotype='in', desc='IEC turbine class'))
    assembly.add(
        'turbulence_class',
        Enum('B', ('A', 'B', 'C'),
             iotype='in',
             desc='IEC turbulence class class'))
    assembly.add(
        'g',
        Float(9.81,
              iotype='in',
              units='m/s**2',
              desc='acceleration of gravity',
              deriv_ignore=True))
    assembly.add(
        'cdf_reference_height_wind_speed',
        Float(
            90.0,
            iotype='in',
            desc=
            'reference hub height for IEC wind speed (used in CDF calculation)'
        ))
    assembly.add('downwind',
                 Bool(False, iotype='in', desc='flag if rotor is downwind'))
    assembly.add('tower_dt',
                 Float(iotype='in', units='m',
                       desc='tower top diameter'))  # update for jacket
    assembly.add('generator_speed',
                 Float(iotype='in', units='rpm', desc='generator speed'))
    assembly.add(
        'machine_rating',
        Float(5000.0, units='kW', iotype='in', desc='machine rated power'))
    assembly.add(
        'rna_weightM',
        Bool(True,
             iotype='in',
             desc='flag to consider or not the RNA weight effect on Moment'))

    assembly.add('rotor', RotorSE())
    if with_new_nacelle:
        assembly.add('hub', HubSE())
        if with_3pt_drive:
            assembly.add('nacelle', Drive3pt())
        else:
            assembly.add('nacelle', Drive4pt())
    else:
        assembly.add('nacelle', DriveWPACT())
        assembly.add('hub', HubWPACT())
    assembly.add('rna', RNAMass())
    assembly.add('rotorloads1', RotorLoads())
    assembly.add('rotorloads2', RotorLoads())
    assembly.add('jacket', JacketSE())
    assembly.add('maxdeflection', MaxTipDeflection())

    if flexible_blade:
        assembly.add('fpi', FixedPointIterator())

        assembly.fpi.workflow.add(['rotor'])
        assembly.fpi.add_parameter('rotor.delta_precurve_sub',
                                   low=-1.e99,
                                   high=1.e99)
        assembly.fpi.add_parameter('rotor.delta_bladeLength',
                                   low=-1.e99,
                                   high=1.e99)
        assembly.fpi.add_constraint(
            'rotor.delta_precurve_sub = rotor.delta_precurve_sub_out')
        assembly.fpi.add_constraint(
            'rotor.delta_bladeLength = rotor.delta_bladeLength_out')
        assembly.fpi.max_iteration = 20
        assembly.fpi.tolerance = 1e-8

        assembly.driver.workflow.add(['fpi'])

    else:
        assembly.driver.workflow.add(['rotor'])

    assembly.driver.workflow.add([
        'hub', 'nacelle', 'jacket', 'maxdeflection', 'rna', 'rotorloads1',
        'rotorloads2'
    ])

    # TODO: rotor drivetrain design should be connected to nacelle drivetrain design

    # connections to rotor
    assembly.connect('machine_rating', 'rotor.control.ratedPower')
    assembly.connect('rho', 'rotor.rho')
    assembly.connect('mu', 'rotor.mu')
    assembly.connect('shear_exponent', 'rotor.shearExp')
    assembly.connect('hub_height', 'rotor.hubHt')
    assembly.connect('turbine_class', 'rotor.turbine_class')
    assembly.connect('turbulence_class', 'rotor.turbulence_class')
    assembly.connect('g', 'rotor.g')
    assembly.connect('cdf_reference_height_wind_speed',
                     'rotor.cdf_reference_height_wind_speed')

    # connections to hub
    assembly.connect('rotor.mass_one_blade', 'hub.blade_mass')
    assembly.connect('rotor.root_bending_moment', 'hub.rotor_bending_moment')
    assembly.connect('rotor.diameter', 'hub.rotor_diameter')
    assembly.connect('rotor.hub_diameter', 'hub.blade_root_diameter')
    assembly.connect('rotor.nBlades', 'hub.blade_number')
    if with_new_nacelle:
        assembly.connect('nacelle.MB1_location', 'hub.MB1_location')
        assembly.connect('rotor.tilt', 'hub.gamma')
        assembly.connect('nacelle.L_rb', 'hub.L_rb')

    # connections to nacelle #TODO: fatigue option variables
    assembly.connect('rotor.diameter', 'nacelle.rotor_diameter')
    if not with_new_nacelle:
        assembly.connect(
            'rotor.mass_all_blades + hub.hub_system_mass', 'nacelle.rotor_mass'
        )  #DODO: circular dependency if using DriveSE (nacelle csm --> hub, hub mass --> nacelle)
    if with_new_nacelle:
        assembly.connect('rotor.nBlades', 'nacelle.blade_number')
        assembly.connect('rotor.tilt', 'nacelle.shaft_angle')
        assembly.connect('333.3 * machine_rating / 1000.0',
                         'nacelle.shrink_disc_mass')
    assembly.connect('1.5 * rotor.ratedConditions.Q', 'nacelle.rotor_torque')
    assembly.connect('rotor.ratedConditions.T', 'nacelle.rotor_thrust')
    assembly.connect('rotor.ratedConditions.Omega', 'nacelle.rotor_speed')
    assembly.connect('machine_rating', 'nacelle.machine_rating')
    assembly.connect('rotor.root_bending_moment',
                     'nacelle.rotor_bending_moment')
    assembly.connect('generator_speed/rotor.ratedConditions.Omega',
                     'nacelle.gear_ratio')
    '''if  with_new_nacelle:
        assembly.connect('rotor.g', 'nacelle.g')''' # Only drive smooth taking g from rotor; TODO: update when drive_smooth is updated
    assembly.connect(
        'tower_dt', 'nacelle.tower_top_diameter'
    )  # OpenMDAO circular dependency issue # update for jacket input

    # connections to rna
    assembly.connect('rotor.mass_all_blades', 'rna.blades_mass')
    assembly.connect('rotor.I_all_blades', 'rna.blades_I')
    assembly.connect('hub.hub_system_mass', 'rna.hub_mass')
    assembly.connect('hub.hub_system_cm', 'rna.hub_cm')
    assembly.connect('hub.hub_system_I', 'rna.hub_I')
    assembly.connect('nacelle.nacelle_mass', 'rna.nac_mass')
    assembly.connect('nacelle.nacelle_cm', 'rna.nac_cm')
    assembly.connect('nacelle.nacelle_I', 'rna.nac_I')

    # connections to rotorloads1
    assembly.connect('downwind', 'rotorloads1.downwind')
    assembly.connect('rna_weightM', 'rotorloads1.rna_weightM')
    assembly.connect('1.8 * rotor.ratedConditions.T', 'rotorloads1.F[0]')
    assembly.connect('rotor.ratedConditions.Q', 'rotorloads1.M[0]')
    assembly.connect('hub.hub_system_cm', 'rotorloads1.r_hub')
    assembly.connect('rna.rna_cm', 'rotorloads1.rna_cm')
    assembly.connect('rotor.tilt', 'rotorloads1.tilt')
    assembly.connect('g', 'rotorloads1.g')
    assembly.connect('rna.rna_mass', 'rotorloads1.m_RNA')

    # connections to rotorloads2
    assembly.connect('downwind', 'rotorloads2.downwind')
    assembly.connect('rna_weightM', 'rotorloads2.rna_weightM')
    assembly.connect('rotor.T_extreme', 'rotorloads2.F[0]')
    assembly.connect('rotor.Q_extreme', 'rotorloads2.M[0]')
    assembly.connect('hub.hub_system_cm', 'rotorloads2.r_hub')
    assembly.connect('rna.rna_cm', 'rotorloads2.rna_cm')
    assembly.connect('rotor.tilt', 'rotorloads2.tilt')
    assembly.connect('g', 'rotorloads2.g')
    assembly.connect('rna.rna_mass', 'rotorloads2.m_RNA')

    # connections to jacket
    assembly.connect('rho', 'jacket.Windinputs.rho')  # jacket input
    assembly.connect('mu', 'jacket.Windinputs.mu')  # jacket input
    assembly.connect('-g', 'jacket.FrameAuxIns.gvector[2]')  # jacket input
    assembly.connect('hub_height', 'jacket.Windinputs.HH')  # jacket input
    assembly.connect('tower_dt', 'jacket.Twrinputs.Dt')  # jacket input
    assembly.connect('rotor.yaw', 'jacket.RNAinputs.yawangle')  # jacket input
    #assembly.connect('hub_height - nacelle.nacelle_cm[2]', 'jacket.Twrinputs.Htwr') # jacket input; TODO: probably irrelevant for this purpose, tower length is now determined in jacket
    assembly.connect('rna.rna_mass', 'jacket.RNAinputs.mass')  # jacket input
    assembly.connect('rna.rna_cm', 'jacket.RNAinputs.CMoff')  # jacket input
    assembly.connect('rna.rna_I_TT', 'jacket.RNAinputs.I')  # jacket input
    # Rated rotor loads (Option 1)
    assembly.connect('rotor.ratedConditions.V',
                     'jacket.Windinputs.U50HH')  # jacket input
    assembly.connect('rotorloads1.top_F', 'jacket.RNA_F[0:3]')  # jacket input
    assembly.connect('rotorloads1.top_M', 'jacket.RNA_F[3:6]')  # jacket input
    # Survival rotor loads (Option 2)
    #assembly.connect('rotor.V_extreme', 'tower.Windinputs.U50HH') # jacket input
    #assembly.connect('rotorloads2.top_F', 'jacket.RNA_F') # jacket input
    #assembly.connect('rotorloads2.top_M', 'jacket.RNA_M') # jacket input

    # connections to maxdeflection
    assembly.connect('rotor.Rtip', 'maxdeflection.Rtip')
    assembly.connect('rotor.precurveTip', 'maxdeflection.precurveTip')
    assembly.connect('rotor.presweepTip', 'maxdeflection.presweepTip')
    assembly.connect('rotor.precone', 'maxdeflection.precone')
    assembly.connect('rotor.tilt', 'maxdeflection.tilt')
    assembly.connect('hub.hub_system_cm', 'maxdeflection.hub_tt')
    assembly.connect(
        'jacket.Twrouts.nodes[2,:]', 'maxdeflection.tower_z'
    )  # jacket input, had to make array dimensions explicit on instantiation for this connect to work ---THIS is the z at CMzoff, not necessarily the top flange
    assembly.connect('jacket.Twrouts', 'maxdeflection.Twrouts'
                     )  # TODO: jacket input - doesnt recognize logobj
    assembly.connect('jacket.Twrouts.Htwr',
                     'maxdeflection.towerHt')  # jacket input
Example #6
0
def example_task37_lcoe(lcoe_group, mb1Type, mb2Type, IEC_Class,
                        gear_configuration, shaft_factor, drivetrain_design,
                        uptower_transformer, yaw_motors_number, crane,
                        blade_number):

    # Add common inputs
    # Add common inputs for rotor
    FUSED_add(
        lcoe_group,
        'rotorvars',
        FUSED_VarComp([
            ('rotor_diameter', 0.0),
            ('rotor_bending_moment_x', 0.0),
            ('rotor_bending_moment_y', 0.0),
            ('rotor_bending_moment_z', 0.0),
            ('rotor_thrust', 0.0),
            ('rotor_force_y', 0.0),
            ('rotor_force_z', 0.0),
            ('rotor_torque', 0.0),
            ('rotor_mass', 0.0),  # remove if using rna component
            ('blade_mass', 0.0),
        ]),
        ['*'])

    # Add common inputs for drivetrain
    FUSED_add(
        lcoe_group, 'drivevars',
        FUSED_VarComp([
            ('machine_rating', 0.0),
            ('gear_ratio', 0.0),
            ('flange_length', 0.0),
            ('overhang', 0.0),
            ('distance_hub2mb', 0.0),
            ('gearbox_input_cm', 0.0),
            ('hss_input_length', 0.0),
        ]), ['*'])

    # Add common inputs for tower
    FUSED_add(lcoe_group, 'towervars',
              FUSED_VarComp([('tower_top_diameter', 0.0)]), ['*'])

    ###
    # Select components
    # hub
    FUSED_add(lcoe_group, 'hub', FUSED_Component(FUSED_Hub(blade_number)),
              ['*'])
    FUSED_add(lcoe_group, 'pitchSystem',
              FUSED_Component(FUSED_PitchSystem(blade_number)), ['*'])
    FUSED_add(lcoe_group, 'spinner', FUSED_Component(FUSED_Spinner()), ['*'])
    FUSED_add(lcoe_group, 'adder', FUSED_Component(FUSED_Hub_System_Adder()),
              ['*'])

    # drivetrain
    FUSED_add(
        lcoe_group, 'lowSpeedShaft',
        FUSED_Component(FUSED_LowSpeedShaft4pt(mb1Type, mb2Type, IEC_Class)),
        ['*'])
    FUSED_add(lcoe_group, 'mainBearing',
              FUSED_Component(FUSED_MainBearing('main')),
              ['lss_design_torque', 'rotor_diameter'
               ])  #explicit connections for bearings
    FUSED_add(lcoe_group, 'secondBearing',
              FUSED_Component(FUSED_MainBearing('second')),
              ['lss_design_torque', 'rotor_diameter'
               ])  #explicit connections for bearings
    FUSED_add(lcoe_group, 'gearbox',
              FUSED_Component(FUSED_Gearbox(gear_configuration, shaft_factor)),
              ['*'])
    FUSED_add(lcoe_group, 'highSpeedSide',
              FUSED_Component(FUSED_HighSpeedSide()), ['*'])
    FUSED_add(lcoe_group, 'generator',
              FUSED_Component(FUSED_Generator(drivetrain_design)), ['*'])
    FUSED_add(lcoe_group, 'bedplate',
              FUSED_Component(FUSED_Bedplate(uptower_transformer)), ['*'])
    FUSED_add(lcoe_group, 'transformer',
              FUSED_Component(FUSED_Transformer(uptower_transformer)), ['*'])
    FUSED_add(lcoe_group, 'rna', FUSED_Component(FUSED_RNASystemAdder()),
              ['*'])
    FUSED_add(lcoe_group, 'above_yaw_massAdder',
              FUSED_Component(FUSED_AboveYawMassAdder(crane)), ['*'])
    FUSED_add(lcoe_group, 'yawSystem',
              FUSED_Component(FUSED_YawSystem(yaw_motors_number)), ['*'])
    FUSED_add(lcoe_group, 'nacelleSystem',
              FUSED_Component(FUSED_NacelleSystemAdder()), ['*'])

    # rna
    FUSED_add(lcoe_group, 'rnamass', RNAMass(), ['*'])

    # tower
    FUSED_add(lcoe_group, 'tower', TowerSE(nLC,
                                           nPoints,
                                           nFull,
                                           nDEL,
                                           wind=wind), ['*'])

    # turbine costs
    FUSED_add(lcoe_group, 'tcc', Turbine_CostsSE_2015(), ['*'])

    # lcoe
    FUSED_add(lcoe_group, 'lcoe', LCOEcalc(), ['*'])

    ###
    # Connect nacelle components where explicit connections needed (for main bearings)
    FUSED_connect(lcoe_group, 'lss_mb1_mass', ['mainBearing.bearing_mass'])
    FUSED_connect(lcoe_group, 'lss_diameter1',
                  ['mainBearing.lss_diameter', 'lss_diameter'])
    FUSED_connect(lcoe_group, 'lss_mb1_cm', ['mainBearing.lss_mb_cm'])
    FUSED_connect(lcoe_group, 'mainBearing.mb_mass', ['mb1_mass'])
    FUSED_connect(lcoe_group, 'mainBearing.mb_cm', ['mb1_cm'])
    FUSED_connect(lcoe_group, 'mainBearing.mb_I', ['mb1_I'])

    FUSED_connect(lcoe_group, 'lss_mb2_mass', ['secondBearing.bearing_mass'])
    FUSED_connect(lcoe_group, 'lss_diameter2', ['secondBearing.lss_diameter'])
    FUSED_connect(lcoe_group, 'lss_mb2_cm', ['secondBearing.lss_mb_cm'])
    FUSED_connect(lcoe_group, 'secondBearing.mb_mass', ['mb2_mass'])
    FUSED_connect(lcoe_group, 'secondBearing.mb_cm', ['mb2_cm'])
    FUSED_connect(lcoe_group, 'secondBearing.mb_I', ['mb2_I'])

    # Connect rna to tower inputs where needed
    #FUSED_connect(lcoe_group, 'rna_mass', 'rna_mass') # mass has same name for tower and rna component
    FUSED_connect(lcoe_group, 'rna_cm', 'rna_cg')
    FUSED_connect(lcoe_group, 'rna_I_TT', 'rna_I')
    # Manually inputing now due to issues with connections
    '''
Example #7
0
def configure_turbine(assembly,
                      with_new_nacelle=True,
                      flexible_blade=False,
                      with_3pt_drive=False):
    """a stand-alone configure method to allow for flatter assemblies

    Parameters
    ----------
    assembly : Assembly
        an openmdao assembly to be configured
    with_new_nacelle : bool
        False uses the default implementation, True uses an experimental implementation designed
        to smooth out discontinities making in amenable for gradient-based optimization
    flexible_blade : bool
        if True, internally solves the coupled aero/structural deflection using fixed point iteration.
        Note that the coupling is currently only in the flapwise deflection, and is primarily
        only important for highly flexible blades.  If False, the aero loads are passed
        to the structure but there is no further iteration.
    """

    # --- general turbine configuration inputs---
    assembly.add(
        'rho',
        Float(1.225,
              iotype='in',
              units='kg/m**3',
              desc='density of air',
              deriv_ignore=True))
    assembly.add(
        'mu',
        Float(1.81206e-5,
              iotype='in',
              units='kg/m/s',
              desc='dynamic viscosity of air',
              deriv_ignore=True))
    assembly.add(
        'shear_exponent',
        Float(0.2, iotype='in', desc='shear exponent', deriv_ignore=True))
    assembly.add('hub_height',
                 Float(90.0, iotype='in', units='m', desc='hub height'))
    assembly.add(
        'turbine_class',
        Enum('I', ('I', 'II', 'III', 'IV'),
             iotype='in',
             desc='IEC turbine class'))
    assembly.add(
        'turbulence_class',
        Enum('B', ('A', 'B', 'C'),
             iotype='in',
             desc='IEC turbulence class class'))
    assembly.add(
        'g',
        Float(9.81,
              iotype='in',
              units='m/s**2',
              desc='acceleration of gravity',
              deriv_ignore=True))
    assembly.add(
        'cdf_reference_height_wind_speed',
        Float(
            90.0,
            iotype='in',
            desc=
            'reference hub height for IEC wind speed (used in CDF calculation)'
        ))
    assembly.add('downwind',
                 Bool(False, iotype='in', desc='flag if rotor is downwind'))
    assembly.add(
        'tower_d',
        Array([0.0], iotype='in', units='m', desc='diameters along tower'))
    assembly.add('generator_speed',
                 Float(iotype='in', units='rpm', desc='generator speed'))
    assembly.add(
        'machine_rating',
        Float(5000.0, units='kW', iotype='in', desc='machine rated power'))
    assembly.add(
        'rna_weightM',
        Bool(True,
             iotype='in',
             desc='flag to consider or not the RNA weight effect on Moment'))

    assembly.add('rotor', RotorSE())
    if with_new_nacelle:
        assembly.add('hub', HubSE())
        assembly.add('hubSystem', Hub_System_Adder_drive())
        assembly.add('moments', blade_moment_transform())
        assembly.add('forces', blade_force_transform())
        if with_3pt_drive:
            assembly.add('nacelle', Drive3pt())
        else:
            assembly.add('nacelle', Drive4pt())
    else:
        assembly.add('nacelle', DriveWPACT())
        assembly.add('hub', HubWPACT())
    assembly.add('rna', RNAMass())
    assembly.add('rotorloads1', RotorLoads())
    assembly.add('rotorloads2', RotorLoads())
    assembly.add('tower', TowerSE())
    assembly.add('maxdeflection', MaxTipDeflection())

    if flexible_blade:
        assembly.add('fpi', FixedPointIterator())

        assembly.fpi.workflow.add(['rotor'])
        assembly.fpi.add_parameter('rotor.delta_precurve_sub',
                                   low=-1.e99,
                                   high=1.e99)
        assembly.fpi.add_parameter('rotor.delta_bladeLength',
                                   low=-1.e99,
                                   high=1.e99)
        assembly.fpi.add_constraint(
            'rotor.delta_precurve_sub = rotor.delta_precurve_sub_out')
        assembly.fpi.add_constraint(
            'rotor.delta_bladeLength = rotor.delta_bladeLength_out')
        assembly.fpi.max_iteration = 20
        assembly.fpi.tolerance = 1e-8

        assembly.driver.workflow.add(['fpi'])

    else:
        assembly.driver.workflow.add(['rotor'])

    assembly.driver.workflow.add([
        'hub', 'nacelle', 'tower', 'maxdeflection', 'rna', 'rotorloads1',
        'rotorloads2'
    ])

    if with_new_nacelle:
        assembly.driver.workflow.add(['hubSystem', 'moments', 'forces'])

    # TODO: rotor drivetrain design should be connected to nacelle drivetrain design

    # connections to rotor
    assembly.connect('machine_rating', 'rotor.control.ratedPower')
    assembly.connect('rho', 'rotor.rho')
    assembly.connect('mu', 'rotor.mu')
    assembly.connect('shear_exponent', 'rotor.shearExp')
    assembly.connect('hub_height', 'rotor.hubHt')
    assembly.connect('turbine_class', 'rotor.turbine_class')
    assembly.connect('turbulence_class', 'rotor.turbulence_class')
    assembly.connect('g', 'rotor.g')
    assembly.connect('cdf_reference_height_wind_speed',
                     'rotor.cdf_reference_height_wind_speed')

    # connections to hub and hub system
    assembly.connect('rotor.mass_one_blade', 'hub.blade_mass')
    assembly.connect('rotor.root_bending_moment', 'hub.rotor_bending_moment')
    assembly.connect('rotor.diameter', ['hub.rotor_diameter'])
    assembly.connect('rotor.hub_diameter', 'hub.blade_root_diameter')
    assembly.connect('rotor.nBlades', 'hub.blade_number')
    if with_new_nacelle:
        assembly.connect('machine_rating', 'hub.machine_rating')
        assembly.connect('rotor.diameter', ['hubSystem.rotor_diameter'])
        assembly.connect('nacelle.MB1_location',
                         'hubSystem.MB1_location')  # TODO: bearing locations
        assembly.connect('nacelle.L_rb', 'hubSystem.L_rb')
        assembly.connect('rotor.tilt', 'hubSystem.shaft_angle')
        assembly.connect('hub.hub_diameter', 'hubSystem.hub_diameter')
        assembly.connect('hub.hub_thickness', 'hubSystem.hub_thickness')
        assembly.connect('hub.hub_mass', 'hubSystem.hub_mass')
        assembly.connect('hub.spinner_mass', 'hubSystem.spinner_mass')
        assembly.connect('hub.pitch_system_mass',
                         'hubSystem.pitch_system_mass')

    # connections to nacelle #TODO: fatigue option variables
    assembly.connect('rotor.diameter', 'nacelle.rotor_diameter')
    assembly.connect('1.5 * rotor.ratedConditions.Q', 'nacelle.rotor_torque')
    assembly.connect('rotor.ratedConditions.T', 'nacelle.rotor_thrust')
    assembly.connect('rotor.ratedConditions.Omega', 'nacelle.rotor_speed')
    assembly.connect('machine_rating', 'nacelle.machine_rating')
    assembly.connect('rotor.root_bending_moment',
                     'nacelle.rotor_bending_moment')
    assembly.connect('generator_speed/rotor.ratedConditions.Omega',
                     'nacelle.gear_ratio')
    assembly.connect(
        'tower_d[-1]',
        'nacelle.tower_top_diameter')  # OpenMDAO circular dependency issue
    assembly.connect(
        'rotor.mass_all_blades + hub.hub_system_mass',
        'nacelle.rotor_mass')  # assuming not already in rotor force / moments
    # variable connections for new nacelle
    if with_new_nacelle:
        assembly.connect('rotor.nBlades', 'nacelle.blade_number')
        assembly.connect('rotor.tilt', 'nacelle.shaft_angle')
        assembly.connect('333.3 * machine_rating / 1000.0',
                         'nacelle.shrink_disc_mass')
        assembly.connect('rotor.hub_diameter', 'nacelle.blade_root_diameter')

        #moments
        # assembly.connect('rotor.Q_extreme','nacelle.rotor_bending_moment_x')
        assembly.connect('rotor.Mxyz_0', 'moments.b1')
        assembly.connect('rotor.Mxyz_120', 'moments.b2')
        assembly.connect('rotor.Mxyz_240', 'moments.b3')
        assembly.connect('rotor.Pitch', 'moments.pitch_angle')
        assembly.connect('rotor.TotalCone', 'moments.cone_angle')
        assembly.connect('moments.Mx', 'nacelle.rotor_bending_moment_x'
                         )  #accounted for in ratedConditions.Q
        assembly.connect('moments.My', 'nacelle.rotor_bending_moment_y')
        assembly.connect('moments.Mz', 'nacelle.rotor_bending_moment_z')

        #forces
        # assembly.connect('rotor.T_extreme','nacelle.rotor_force_x')
        assembly.connect('rotor.Fxyz_0', 'forces.b1')
        assembly.connect('rotor.Fxyz_120', 'forces.b2')
        assembly.connect('rotor.Fxyz_240', 'forces.b3')
        assembly.connect('rotor.Pitch', 'forces.pitch_angle')
        assembly.connect('rotor.TotalCone', 'forces.cone_angle')
        assembly.connect('forces.Fx', 'nacelle.rotor_force_x')
        assembly.connect('forces.Fy', 'nacelle.rotor_force_y')
        assembly.connect('forces.Fz', 'nacelle.rotor_force_z')
    '''if  with_new_nacelle:
        assembly.connect('rotor.g', 'nacelle.g') # Only drive smooth taking g from rotor; TODO: update when drive_smooth is updated'''

    # connections to rna
    assembly.connect('rotor.mass_all_blades', 'rna.blades_mass')
    assembly.connect('rotor.I_all_blades', 'rna.blades_I')
    if with_new_nacelle:
        assembly.connect('hubSystem.hub_system_mass', 'rna.hub_mass')
        assembly.connect('hubSystem.hub_system_cm', 'rna.hub_cm')
        assembly.connect('hubSystem.hub_system_I', 'rna.hub_I')
    else:
        assembly.connect('hub.hub_system_mass', 'rna.hub_mass')
        assembly.connect('hub.hub_system_cm', 'rna.hub_cm')
        assembly.connect('hub.hub_system_I', 'rna.hub_I')
    assembly.connect('nacelle.nacelle_mass', 'rna.nac_mass')
    assembly.connect('nacelle.nacelle_cm', 'rna.nac_cm')
    assembly.connect('nacelle.nacelle_I', 'rna.nac_I')

    # connections to rotorloads1
    assembly.connect('downwind', 'rotorloads1.downwind')
    assembly.connect('rna_weightM', 'rotorloads1.rna_weightM')
    assembly.connect('1.8 * rotor.ratedConditions.T', 'rotorloads1.F[0]')
    assembly.connect('rotor.ratedConditions.Q', 'rotorloads1.M[0]')
    if with_new_nacelle:
        assembly.connect('hubSystem.hub_system_cm', 'rotorloads1.r_hub')
    else:
        assembly.connect('hub.hub_system_cm', 'rotorloads1.r_hub')
    assembly.connect('rna.rna_cm', 'rotorloads1.rna_cm')
    assembly.connect('rotor.tilt', 'rotorloads1.tilt')
    assembly.connect('g', 'rotorloads1.g')
    assembly.connect('rna.rna_mass', 'rotorloads1.m_RNA')

    # connections to rotorloads2
    assembly.connect('downwind', 'rotorloads2.downwind')
    assembly.connect('rna_weightM', 'rotorloads2.rna_weightM')
    assembly.connect('rotor.T_extreme', 'rotorloads2.F[0]')
    assembly.connect('rotor.Q_extreme', 'rotorloads2.M[0]')
    if with_new_nacelle:
        assembly.connect('hubSystem.hub_system_cm', 'rotorloads2.r_hub')
    else:
        assembly.connect('hub.hub_system_cm', 'rotorloads2.r_hub')
    assembly.connect('rna.rna_cm', 'rotorloads2.rna_cm')
    assembly.connect('rotor.tilt', 'rotorloads2.tilt')
    assembly.connect('g', 'rotorloads2.g')
    assembly.connect('rna.rna_mass', 'rotorloads2.m_RNA')

    # connections to tower
    assembly.connect('rho', 'tower.wind_rho')
    assembly.connect('mu', 'tower.wind_mu')
    assembly.connect('g', 'tower.g')
    assembly.connect('hub_height', 'tower.wind_zref')
    assembly.connect('tower_d', 'tower.d_param')
    assembly.connect('rotor.ratedConditions.V', 'tower.wind_Uref1')
    assembly.connect('rotor.V_extreme', 'tower.wind_Uref2')
    assembly.connect('rotor.yaw', 'tower.yaw')
    assembly.connect('hub_height - nacelle.nacelle_cm[2]',
                     'tower.z_param[-1]')  #TODO: hub height should be derived
    assembly.connect('rna.rna_mass', 'tower.m[0]')
    assembly.connect('rna.rna_cm[0]', 'tower.mrhox[0]')
    assembly.connect('rna.rna_cm[1]', 'tower.mrhoy[0]')
    assembly.connect('rna.rna_cm[2]', 'tower.mrhoz[0]')
    assembly.connect('rna.rna_I_TT[0]', 'tower.mIxx[0]')
    assembly.connect('rna.rna_I_TT[1]', 'tower.mIyy[0]')
    assembly.connect('rna.rna_I_TT[2]', 'tower.mIzz[0]')
    assembly.connect('rna.rna_I_TT[3]', 'tower.mIxy[0]')
    assembly.connect('rna.rna_I_TT[4]', 'tower.mIxz[0]')
    assembly.connect('rna.rna_I_TT[5]', 'tower.mIyz[0]')
    assembly.connect('rotorloads1.top_F[0]', 'tower.Fx1[0]')
    assembly.connect('rotorloads1.top_F[1]', 'tower.Fy1[0]')
    assembly.connect('rotorloads1.top_F[2]', 'tower.Fz1[0]')
    assembly.connect('rotorloads1.top_M[0]', 'tower.Mxx1[0]')
    assembly.connect('rotorloads1.top_M[1]', 'tower.Myy1[0]')
    assembly.connect('rotorloads1.top_M[2]', 'tower.Mzz1[0]')
    assembly.connect('rotorloads2.top_F[0]', 'tower.Fx2[0]')
    assembly.connect('rotorloads2.top_F[1]', 'tower.Fy2[0]')
    assembly.connect('rotorloads2.top_F[2]', 'tower.Fz2[0]')
    assembly.connect('rotorloads2.top_M[0]', 'tower.Mxx2[0]')
    assembly.connect('rotorloads2.top_M[1]', 'tower.Myy2[0]')
    assembly.connect('rotorloads2.top_M[2]', 'tower.Mzz2[0]')

    # connections to maxdeflection
    assembly.connect('rotor.Rtip', 'maxdeflection.Rtip')
    assembly.connect('rotor.precurveTip', 'maxdeflection.precurveTip')
    assembly.connect('rotor.presweepTip', 'maxdeflection.presweepTip')
    assembly.connect('rotor.precone', 'maxdeflection.precone')
    assembly.connect('rotor.tilt', 'maxdeflection.tilt')
    if with_new_nacelle:
        assembly.connect('hubSystem.hub_system_cm', 'maxdeflection.hub_tt')
    else:
        assembly.connect('hub.hub_system_cm', 'maxdeflection.hub_tt')
    assembly.connect('tower.z_param', 'maxdeflection.tower_z')
    assembly.connect('tower.d_param', 'maxdeflection.tower_d')
    assembly.connect('hub_height - nacelle.nacelle_cm[2]',
                     'maxdeflection.towerHt')