def runOpenMdaoDEP():

    prob = Problem()

    #first guesses here
    indeps = prob.model.add_subsystem('indeps', IndepVarComp(), promotes=['*'])

    # load defaults from BPAirfoil
    bp = BPAirfoil()
    # read last optimization result if available (has to be copied here manually)
    if os.path.isfile(INPUT_DIR+'/'+'airfoil.txt'):
        bp.read_parameters_from_file(INPUT_DIR+'/'+'airfoil.txt')
    indeps.add_output('r_le', bp.r_le)
    indeps.add_output('beta_te', bp.beta_te)
    indeps.add_output('x_t', bp.x_t)

    indeps.add_output('gamma_le', bp.gamma_le)
    indeps.add_output('x_c', bp.x_c)
    indeps.add_output('y_c', bp.y_c)
    indeps.add_output('alpha_te', bp.alpha_te)
    #indeps.add_output('z_te', bp.z_te)

    indeps.add_output('b_8', bp.b_8)
    indeps.add_output('b_15', bp.b_15)
    indeps.add_output('b_0', bp.b_0)
    indeps.add_output('b_2', bp.b_2)
    indeps.add_output('b_17', bp.b_17)

    prob.model.add_subsystem('airfoil_cfd', AirfoilCFD())

    prob.model.connect('r_le', 'airfoil_cfd.r_le')
    prob.model.connect('beta_te', 'airfoil_cfd.beta_te')
    prob.model.connect('x_t', 'airfoil_cfd.x_t')

    prob.model.connect('gamma_le', 'airfoil_cfd.gamma_le')
    prob.model.connect('x_c', 'airfoil_cfd.x_c')
    prob.model.connect('y_c', 'airfoil_cfd.y_c')
    prob.model.connect('alpha_te', 'airfoil_cfd.alpha_te')
    #prob.model.connect('z_te', 'airfoil_cfd.z_te')

    prob.model.connect('b_8', 'airfoil_cfd.b_8')
    prob.model.connect('b_15', 'airfoil_cfd.b_15')
    prob.model.connect('b_0', 'airfoil_cfd.b_0')
    prob.model.connect('b_2', 'airfoil_cfd.b_2')
    prob.model.connect('b_17', 'airfoil_cfd.b_17')

    # setup the optimization
    prob.driver = ScipyOptimizeDriver()
    prob.driver.options['optimizer'] = 'SLSQP'
    prob.driver.options['tol'] = 1e-6
    prob.driver.options['maxiter'] = 100000

    # setup recorder
    recorder = SqliteRecorder(WORKING_DIR + '/openMdaoLog.sql')
    prob.driver.add_recorder(recorder)
    prob.driver.recording_options['record_desvars'] = True
    prob.driver.recording_options['record_responses'] = True
    prob.driver.recording_options['record_objectives'] = True
    prob.driver.recording_options['record_constraints'] = True

    #limits and constraints
    prob.model.add_design_var('r_le', upper=0.)#, lower=-1*bp.y_t, upper=0)
    prob.model.add_design_var('beta_te')#, lower=bp.beta_te*lowerPro, upper=bp.beta_te*upperPro)
    #prob.model.add_design_var('dz_te', lower=0., upper=0.)
    prob.model.add_design_var('x_t', lower=0.)#, lower=0.25, upper=0.5)
    #prob.model.add_design_var('y_t')#, lower=0.075, upper=0.09)

    prob.model.add_design_var('gamma_le')#, lower=bp.gamma_le*lowerPro, upper=bp.gamma_le*upperPro)
    prob.model.add_design_var('x_c')#, lower=bp.x_c*lowerPro, upper=bp.x_c*upperPro)
    prob.model.add_design_var('y_c')#, lower=bp.y_c*lowerPro, upper=bp.y_c*upperPro)
    prob.model.add_design_var('alpha_te')#, lower=bp.alpha_te*upperPro, upper=bp.alpha_te*lowerPro)
    #prob.model.add_design_var('z_te')#, lower=0., upper=0.)

    prob.model.add_design_var('b_8')#, lower=bp.b_8*lowerPro, upper=bp.b_8*upperPro)
    prob.model.add_design_var('b_15')#, lower=bp.b_15*lowerPro, upper=bp.b_15*upperPro)
    prob.model.add_design_var('b_0')#, lower=bp.b_0*lowerPro, upper=bp.b_0*upperPro)
    prob.model.add_design_var('b_2')#, lower=bp.b_2*lowerPro, upper=bp.b_2*upperPro)
    prob.model.add_design_var('b_17')#, lower=bp.b_17*lowerPro, upper=bp.b_17*upperPro)

    prob.model.add_objective('airfoil_cfd.c_d', scaler=1)

    prob.model.add_constraint('airfoil_cfd.cabin_height', lower=cabinHeigth * 0.99, upper=cabinHeigth*1.05)
    prob.model.add_constraint('airfoil_cfd.c_l', lower=0.145, upper=.155)
    prob.model.add_constraint('airfoil_cfd.c_m', lower=-0.05, upper=99.)

    write_to_log('iterations,time,c_l,c_d,c_m,CL/CD,cfdIterations,cabin_height,offsetFront,angle,r_le,beta_te,x_t,y_t,gamma_le,x_c,y_c,alpha_te,z_te,b_8,b_15,b_0,b_17,b_2]))')

    prob.setup()
    prob.set_solver_print(level=0)
    prob.model.approx_totals()
    prob.run_driver()

    print('done')
    print('cabin frontOffset: ' + str(prob['airfoil_cfd.offsetFront']))
    print('cabin angle: ' + str(-1. * prob['airfoil_cfd.angle']) + ' deg')

    print('c_l= ' + str(prob['airfoil_cfd.c_l']))
    print('c_d= ' + str(prob['airfoil_cfd.c_d']))
    print('c_m= ' + str(prob['airfoil_cfd.c_m']))

    print('execution counts airfoil cfd: ' + str(prob.model.airfoil_cfd.executionCounter))
Example #2
0
 # Tower
 # prob.model.add_constraint('tow.height_constraint',    lower=-1e-2,upper=1.e-2)
 # prob.model.add_constraint('tow.post.stress',          upper=1.0)
 # prob.model.add_constraint('tow.post.global_buckling', upper=1.0)
 # prob.model.add_constraint('tow.post.shell_buckling',  upper=1.0)
 # prob.model.add_constraint('tow.weldability',          upper=0.0)
 # prob.model.add_constraint('tow.manufacturability',    lower=0.0)
 # prob.model.add_constraint('frequencyNP_margin',       upper=0.)
 # prob.model.add_constraint('frequency1P_margin',       upper=0.)
 # prob.model.add_constraint('ground_clearance',         lower=20.0)
 # ----------------------
 
 # --- Recorder ---
 filename_opt_log = folder_output + os.sep + 'log_opt_' + blade['config']['name']
 
 prob.driver.add_recorder(SqliteRecorder(filename_opt_log))
 prob.driver.recording_options['includes'] = ['AEP','total_blade_cost','lcoe','tip_deflection_ratio']
 prob.driver.recording_options['record_objectives']  = True
 prob.driver.recording_options['record_constraints'] = True
 prob.driver.recording_options['record_desvars']     = True
 # ----------------------
 
 # --- Run ---
 prob.setup()
 prob = Init_MonopileTurbine(prob, blade, Nsection_Tow = Nsection_Tow)
 prob['drive.shaft_angle']              = np.radians(6.)
 prob['overhang']                       = 8.5
 prob['drive.distance_hub2mb']          = 3.5
 prob['significant_wave_height']        = 4.52
 prob['significant_wave_period']        = 9.45
 prob['monopile']                       = True
Example #3
0
    def test(self):

        # Create a dictionary to store options about the surface
        mesh_dict = {
            'num_y': 7,
            'num_x': 3,
            'wing_type': 'uCRM_based',
            'symmetry': True,
            'chord_cos_spacing': 0,
            'span_cos_spacing': 0,
            'num_twist_cp': 6,
        }

        mesh, twist_cp = generate_mesh(mesh_dict)

        surf_dict = {
            # Wing definition
            'name':
            'wing',  # name of the surface
            'symmetry':
            True,  # if true, model one half of wing
            'S_ref_type':
            'wetted',  # how we compute the wing area,
            # can be 'wetted' or 'projected'
            'mesh':
            mesh,
            'twist_cp':
            np.array([4., 5., 8., 8., 8., 9.]),
            'fem_model_type':
            'wingbox',
            'data_x_upper':
            upper_x,
            'data_x_lower':
            lower_x,
            'data_y_upper':
            upper_y,
            'data_y_lower':
            lower_y,
            'spar_thickness_cp':
            np.array([0.004, 0.005, 0.005, 0.008, 0.008, 0.01]),  # [m]
            'skin_thickness_cp':
            np.array([0.005, 0.01, 0.015, 0.020, 0.025, 0.026]),
            'original_wingbox_airfoil_t_over_c':
            0.12,

            # Aerodynamic deltas.
            # These CL0 and CD0 values are added to the CL and CD
            # obtained from aerodynamic analysis of the surface to get
            # the total CL and CD.
            # These CL0 and CD0 values do not vary wrt alpha.
            # They can be used to account for things that are not included, such as contributions from the fuselage, nacelles, tail surfaces, etc.
            'CL0':
            0.0,
            'CD0':
            0.0078,
            'with_viscous':
            True,  # if true, compute viscous drag
            'with_wave':
            True,  # if true, compute wave drag

            # Airfoil properties for viscous drag calculation
            'k_lam':
            0.05,  # percentage of chord with laminar
            # flow, used for viscous drag
            'c_max_t':
            .38,  # chordwise location of maximum thickness
            't_over_c_cp':
            np.array([0.08, 0.08, 0.08, 0.10, 0.10, 0.08]),

            # Structural values are based on aluminum 7075
            'E':
            73.1e9,  # [Pa] Young's modulus
            'G': (
                73.1e9 / 2 / 1.33
            ),  # [Pa] shear modulus (calculated using E and the Poisson's ratio here)
            'yield': (420.e6 / 1.5),  # [Pa] allowable yield stress
            'mrho':
            2.78e3,  # [kg/m^3] material density
            'strength_factor_for_upper_skin':
            1.0,  # the yield stress is multiplied by this factor for the upper skin
            'wing_weight_ratio':
            1.25,
            'exact_failure_constraint':
            False,  # if false, use KS function
            'struct_weight_relief':
            True,
            'distributed_fuel_weight':
            True,
            'fuel_density':
            803.,  # [kg/m^3] fuel density (only needed if the fuel-in-wing volume constraint is used)
            'Wf_reserve':
            15000.,  # [kg] reserve fuel mass
        }

        surfaces = [surf_dict]

        # Create the problem and assign the model group
        prob = Problem()

        # Add problem information as an independent variables component
        indep_var_comp = IndepVarComp()
        indep_var_comp.add_output('v',
                                  val=np.array([.85 * 295.07, .64 * 340.294]),
                                  units='m/s')
        indep_var_comp.add_output('alpha', val=0., units='deg')
        indep_var_comp.add_output('alpha_maneuver', val=0., units='deg')
        indep_var_comp.add_output('Mach_number', val=np.array([0.85, 0.64]))
        indep_var_comp.add_output('re',val=np.array([0.348*295.07*.85*1./(1.43*1e-5), \
                                  1.225*340.294*.64*1./(1.81206*1e-5)]),  units='1/m')
        indep_var_comp.add_output('rho',
                                  val=np.array([0.348, 1.225]),
                                  units='kg/m**3')
        indep_var_comp.add_output('CT', val=0.53 / 3600, units='1/s')
        indep_var_comp.add_output('R', val=14.307e6, units='m')
        indep_var_comp.add_output('W0',
                                  val=148000 + surf_dict['Wf_reserve'],
                                  units='kg')
        indep_var_comp.add_output('speed_of_sound',
                                  val=np.array([295.07, 340.294]),
                                  units='m/s')
        indep_var_comp.add_output('load_factor', val=np.array([1., 2.5]))
        indep_var_comp.add_output('empty_cg', val=np.zeros((3)), units='m')
        indep_var_comp.add_output('fuel_mass', val=10000., units='kg')

        prob.model.add_subsystem('prob_vars', indep_var_comp, promotes=['*'])

        # Loop over each surface in the surfaces list
        for surface in surfaces:

            # Get the surface name and create a group to contain components
            # only for this surface
            name = surface['name']

            aerostruct_group = AerostructGeometry(surface=surface)

            # Add group to the problem with the name of the surface.
            prob.model.add_subsystem(name, aerostruct_group)

        # Loop through and add a certain number of aerostruct points
        for i in range(2):

            point_name = 'AS_point_{}'.format(i)
            # Connect the parameters within the model for each aerostruct point

            # Create the aero point group and add it to the model
            AS_point = AerostructPoint(surfaces=surfaces,
                                       internally_connect_fuelburn=False)

            prob.model.add_subsystem(point_name, AS_point)

            # Connect flow properties to the analysis point
            prob.model.connect('v', point_name + '.v', src_indices=[i])
            prob.model.connect('Mach_number',
                               point_name + '.Mach_number',
                               src_indices=[i])
            prob.model.connect('re', point_name + '.re', src_indices=[i])
            prob.model.connect('rho', point_name + '.rho', src_indices=[i])
            prob.model.connect('CT', point_name + '.CT')
            prob.model.connect('R', point_name + '.R')
            prob.model.connect('W0', point_name + '.W0')
            prob.model.connect('speed_of_sound',
                               point_name + '.speed_of_sound',
                               src_indices=[i])
            prob.model.connect('empty_cg', point_name + '.empty_cg')
            prob.model.connect('load_factor',
                               point_name + '.load_factor',
                               src_indices=[i])
            prob.model.connect('fuel_mass',
                               point_name + '.total_perf.L_equals_W.fuelburn')
            prob.model.connect('fuel_mass',
                               point_name + '.total_perf.CG.fuelburn')

            for surface in surfaces:

                name = surface['name']

                if surf_dict['distributed_fuel_weight']:
                    prob.model.connect('load_factor',
                                       point_name + '.coupled.load_factor',
                                       src_indices=[i])

                com_name = point_name + '.' + name + '_perf.'
                prob.model.connect(
                    name + '.local_stiff_transformed', point_name +
                    '.coupled.' + name + '.local_stiff_transformed')
                prob.model.connect(name + '.nodes',
                                   point_name + '.coupled.' + name + '.nodes')

                # Connect aerodyamic mesh to coupled group mesh
                prob.model.connect(name + '.mesh',
                                   point_name + '.coupled.' + name + '.mesh')
                if surf_dict['struct_weight_relief']:
                    prob.model.connect(
                        name + '.element_mass',
                        point_name + '.coupled.' + name + '.element_mass')

                # Connect performance calculation variables
                prob.model.connect(name + '.nodes', com_name + 'nodes')
                prob.model.connect(
                    name + '.cg_location',
                    point_name + '.' + 'total_perf.' + name + '_cg_location')
                prob.model.connect(
                    name + '.structural_mass', point_name + '.' +
                    'total_perf.' + name + '_structural_mass')

                # Connect wingbox properties to von Mises stress calcs
                prob.model.connect(name + '.Qz', com_name + 'Qz')
                prob.model.connect(name + '.J', com_name + 'J')
                prob.model.connect(name + '.A_enc', com_name + 'A_enc')
                prob.model.connect(name + '.htop', com_name + 'htop')
                prob.model.connect(name + '.hbottom', com_name + 'hbottom')
                prob.model.connect(name + '.hfront', com_name + 'hfront')
                prob.model.connect(name + '.hrear', com_name + 'hrear')

                prob.model.connect(name + '.spar_thickness',
                                   com_name + 'spar_thickness')
                prob.model.connect(name + '.t_over_c', com_name + 't_over_c')

        prob.model.connect('alpha', 'AS_point_0' + '.alpha')
        prob.model.connect('alpha_maneuver', 'AS_point_1' + '.alpha')

        # Here we add the fuel volume constraint componenet to the model
        prob.model.add_subsystem('fuel_vol_delta',
                                 WingboxFuelVolDelta(surface=surface))
        prob.model.connect('wing.struct_setup.fuel_vols',
                           'fuel_vol_delta.fuel_vols')
        prob.model.connect('AS_point_0.fuelburn', 'fuel_vol_delta.fuelburn')

        if surf_dict['distributed_fuel_weight']:
            prob.model.connect(
                'wing.struct_setup.fuel_vols',
                'AS_point_0.coupled.wing.struct_states.fuel_vols')
            prob.model.connect(
                'fuel_mass', 'AS_point_0.coupled.wing.struct_states.fuel_mass')

            prob.model.connect(
                'wing.struct_setup.fuel_vols',
                'AS_point_1.coupled.wing.struct_states.fuel_vols')
            prob.model.connect(
                'fuel_mass', 'AS_point_1.coupled.wing.struct_states.fuel_mass')

        comp = ExecComp('fuel_diff = (fuel_mass - fuelburn) / fuelburn',
                        units='kg')
        prob.model.add_subsystem('fuel_diff',
                                 comp,
                                 promotes_inputs=['fuel_mass'],
                                 promotes_outputs=['fuel_diff'])
        prob.model.connect('AS_point_0.fuelburn', 'fuel_diff.fuelburn')

        ## Use these settings if you do not have pyOptSparse or SNOPT
        prob.driver = ScipyOptimizeDriver()
        prob.driver.options['optimizer'] = 'SLSQP'
        prob.driver.options['tol'] = 1e-8

        recorder = SqliteRecorder("unit_test.db")
        prob.driver.add_recorder(recorder)

        # We could also just use prob.driver.recording_options['includes']=['*'] here, but for large meshes the database file becomes extremely large. So we just select the variables we need.
        prob.driver.recording_options['includes'] = [
            'alpha',
            'rho',
            'v',
            'cg',
            'AS_point_1.cg',
            'AS_point_0.cg',
            'AS_point_0.coupled.wing_loads.loads',
            'AS_point_1.coupled.wing_loads.loads',
            'AS_point_0.coupled.wing.normals',
            'AS_point_1.coupled.wing.normals',
            'AS_point_0.coupled.wing.widths',
            'AS_point_1.coupled.wing.widths',
            'AS_point_0.coupled.aero_states.wing_sec_forces',
            'AS_point_1.coupled.aero_states.wing_sec_forces',
            'AS_point_0.wing_perf.CL1',
            'AS_point_1.wing_perf.CL1',
            'AS_point_0.coupled.wing.S_ref',
            'AS_point_1.coupled.wing.S_ref',
            'wing.geometry.twist',
            'wing.mesh',
            'wing.skin_thickness',
            'wing.spar_thickness',
            'wing.t_over_c',
            'wing.structural_mass',
            'AS_point_0.wing_perf.vonmises',
            'AS_point_1.wing_perf.vonmises',
            'AS_point_0.coupled.wing.def_mesh',
            'AS_point_1.coupled.wing.def_mesh',
        ]

        prob.driver.recording_options['record_objectives'] = True
        prob.driver.recording_options['record_constraints'] = True
        prob.driver.recording_options['record_desvars'] = True
        prob.driver.recording_options['record_inputs'] = True

        prob.model.add_objective('AS_point_0.fuelburn', scaler=1e-5)

        prob.model.add_design_var('wing.twist_cp',
                                  lower=-15.,
                                  upper=15.,
                                  scaler=0.1)
        prob.model.add_design_var('wing.spar_thickness_cp',
                                  lower=0.003,
                                  upper=0.1,
                                  scaler=1e2)
        prob.model.add_design_var('wing.skin_thickness_cp',
                                  lower=0.003,
                                  upper=0.1,
                                  scaler=1e2)
        prob.model.add_design_var('wing.geometry.t_over_c_cp',
                                  lower=0.07,
                                  upper=0.2,
                                  scaler=10.)
        prob.model.add_design_var('fuel_mass',
                                  lower=0.,
                                  upper=2e5,
                                  scaler=1e-5)
        prob.model.add_design_var('alpha_maneuver', lower=-15., upper=15)

        prob.model.add_constraint('AS_point_0.CL', equals=0.5)
        prob.model.add_constraint('AS_point_1.L_equals_W', equals=0.)
        prob.model.add_constraint('AS_point_1.wing_perf.failure', upper=0.)

        prob.model.add_constraint('fuel_vol_delta.fuel_vol_delta', lower=0.)
        prob.model.add_constraint('fuel_diff', equals=0.)

        # Set up the problem
        prob.setup()

        prob.run_driver()

        # print(prob['AS_point_0.fuelburn'][0])
        # print(prob['wing.structural_mass'][0]/surf_dict['wing_weight_ratio'])
        # print(prob['wing.geometry.t_over_c_cp'])

        assert_rel_error(self, prob['AS_point_0.fuelburn'][0], 101937.827384,
                         1e-5)
        assert_rel_error(
            self,
            prob['wing.structural_mass'][0] / surf_dict['wing_weight_ratio'],
            36539.6437566, 1e-5)
        assert_rel_error(
            self, prob['wing.geometry.t_over_c_cp'],
            np.array([
                0.10247881, 0.08207636, 0.11114547, 0.13114547, 0.10207636,
                0.09365598
            ]), 1e-5)
def setup_energy_opt(num_seg,
                     order,
                     Q_env=0.,
                     Q_sink=0.,
                     Q_out=0.,
                     m_flow=0.1,
                     m_burn=0.,
                     opt_m_flow=False,
                     opt_m_burn=False):
    """
    Helper function to set up and return a problem instance for an energy minimization
    of a simple thermal system.

    Parameters
    ----------
    num_seg : int
        The number of ODE segments to use when discretizing the problem.
    order : int
        The order for the polynomial interpolation for the collocation methods.
    """

    # Instantiate the problem and set the optimizer
    p = Problem(model=Group())
    p.driver = pyOptSparseDriver()
    p.driver.options['optimizer'] = 'SNOPT'
    p.driver.opt_settings['Major iterations limit'] = 2000
    p.driver.opt_settings['Major feasibility tolerance'] = 1.0E-7
    p.driver.opt_settings['Major optimality tolerance'] = 1.0E-7
    p.driver.opt_settings['Verify level'] = -1

    # Set up the phase for the defined ODE function, can be LGR or LGL
    phase = Phase('gauss-lobatto',
                  ode_class=TankAloneODE,
                  ode_init_kwargs={},
                  num_segments=num_seg,
                  transcription_order=order,
                  compressed=True)

    # Do not allow the time to vary during the optimization
    phase.set_time_options(opt_initial=False, opt_duration=False)

    # Set the state options for mass, temperature, and energy.
    phase.set_state_options('m', lower=1., upper=10., fix_initial=False)
    phase.set_state_options('T', fix_initial=True)
    phase.set_state_options('energy', fix_initial=True)

    # Minimize the energy used to pump the fuel
    # phase.add_objective('energy', loc='final')
    # phase.add_objective('m', loc='initial')
    phase.add_objective('time', loc='final')

    # Allow the optimizer to vary the fuel flow
    if opt_m_flow:
        phase.add_control('m_flow',
                          val=m_flow,
                          lower=0.01,
                          opt=True,
                          rate_continuity=True)
    else:
        phase.add_control('m_flow', val=m_flow, opt=False)

    if opt_m_burn:
        phase.add_control('m_burn',
                          val=m_burn,
                          lower=0.01,
                          opt=True,
                          rate_continuity=True)
    else:
        phase.add_control('m_burn', val=m_burn, opt=False)

    phase.add_control('Q_env', val=Q_env, dynamic=False, opt=False)
    phase.add_control('Q_sink', val=Q_sink, dynamic=False, opt=False)
    phase.add_control('Q_out', val=Q_out, dynamic=False, opt=False)

    # Constrain the temperature, 2nd derivative of fuel mass in the tank, and make
    # sure that the amount recirculated is at least 0, otherwise we'd burn
    # more fuel than we pumped.
    if opt_m_flow:
        phase.add_path_constraint('T', upper=1.)
        phase.add_path_constraint('m_flow_rate', upper=0.)
        phase.add_path_constraint('m_recirculated', lower=0.)
        phase.add_path_constraint('m_flow', upper=3.)

    # Add the phase to the problem and set it up
    p.model.add_subsystem('phase', phase)
    p.driver.add_recorder(SqliteRecorder('out.db'))
    p.setup(check=True, force_alloc_complex=True, mode='fwd')

    # Give initial values for the phase states, controls, and time
    p['phase.states:m'] = 2.
    p['phase.states:T'] = 1.
    p['phase.states:energy'] = 0.
    p['phase.t_initial'] = 0.
    p['phase.t_duration'] = 10.

    p.set_solver_print(level=-1)

    return p
Example #5
0
    top.driver.add_constraint('con_m_l', lower=0., scaler=1/scaled_mass)

    for i in range(N):
        top.driver.add_constraint('delta_omega_u_'+str(i+1), upper=0., scaler=1/np.sqrt(eigval_ref[i]))

    for i in range(N):
        top.driver.add_constraint('delta_omega_l_'+str(i+1), lower=0., scaler=1/np.sqrt(eigval_ref[i]))

    for i in range(tn):
        top.driver.add_constraint('t_l_'+str(i+1), lower=0., scaler=1/t_0[i])

    for i in range(mn):
        top.driver.add_constraint('m_l_'+str(i+1), lower=0., scaler=1/m_0[i])

    #Optimization Recorder
    recorder = SqliteRecorder('modal_optim_COBYLA_GARTEUR')
    recorder.options['record_params'] = True
    recorder.options['record_metadata'] = True
    top.driver.add_recorder(recorder)

    top.setup()
    view_model(top, show_browser=False)

    #Setting initial values for design variables
    top['t'] = t_0
    top['m'] = m_0
#    top['t'] = np.array([50.,11.,10.,10.,10.,10.])
#    top['m'] = np.array([0.5,0.2,0.2])

    top.run()
        prob.model.add_constraint('tow.post.stress', upper=1.0)
        prob.model.add_constraint('tow.post.global_buckling', upper=1.0)
        prob.model.add_constraint('tow.post.shell_buckling', upper=1.0)
        prob.model.add_constraint('tow.weldability', upper=0.0)
        prob.model.add_constraint('tow.manufacturability', lower=0.0)
        # prob.model.add_constraint('frequency1P_margin_low',              upper=1.0)
        # prob.model.add_constraint('frequency1P_margin_high', lower=1.0)
        # prob.model.add_constraint('frequencyNP_margin_low',              upper=1.0)
        # prob.model.add_constraint('frequencyNP_margin_high', lower=1.0)
        prob.model.add_constraint('frequencyNP_margin', upper=0.)
        prob.model.add_constraint('frequency1P_margin', upper=0.)
        prob.model.add_constraint('ground_clearance', lower=20.0)
        # ----------------------

        # --- Recorder ---
        prob.driver.add_recorder(SqliteRecorder('log_opt.sql'))
        prob.driver.recording_options['includes'] = [
            'AEP', 'rc.total_blade_cost', 'lcoe', 'tip_deflection_ratio'
        ]
        prob.driver.recording_options['record_objectives'] = True
        prob.driver.recording_options['record_constraints'] = True
        prob.driver.recording_options['record_desvars'] = True
        # ----------------------

    prob.setup(check=True)

    prob = Init_LandBasedAssembly(prob, blade, Nsection_Tow)
    prob.model.nonlinear_solver = NonlinearRunOnce()
    prob.model.linear_solver = DirectSolver()

    if not MPI:
prob.model.add_constraint('con_esf', upper=0.0)
prob.model.add_constraint('con_temp', upper=0.0)

#Coupling constraints
#Threshold for the coupling (constraints define as (x_in-x_out)**2<epsilon)
epsilon=1e-10
prob.model.add_constraint('con_str_aer_wt',upper=epsilon)
prob.model.add_constraint('con_str_aer_theta',upper=epsilon)
prob.model.add_constraint('con_aer_str_l',upper=epsilon)
prob.model.add_constraint('con_aer_pro_d',upper=epsilon)
prob.model.add_constraint('con_pro_aer_esf',upper=epsilon)
prob.model.add_constraint('con_pro_str_we',upper=epsilon)
#Recorder
db_name = 'ssbj_idf.sqlite'
if "--plot" in argv:
    recorder = SqliteRecorder(db_name)
#    recorder2 = WebRecorder("", case_name="SSBJ IDF")
    prob.driver.recording_options['record_desvars'] = True
    prob.driver.recording_options['record_objectives'] = True
    prob.driver.recording_options['record_constraints'] = True
    prob.driver.add_recorder(recorder)
#    prob.driver.add_recorder(recorder2)

#Run optimization
prob.setup(mode='fwd')
prob.run_driver()
#prob.run_model()
#prob.check_partials()
#prob.cleanup()

print('Z_opt=', prob['z']*scalers['z'])
Example #8
0
prob = Problem()
prob.root = root

prob.driver = ScipyOptimizer()
prob.driver.options['optimizer'] = 'SLSQP'
prob.driver.options['disp'] = True
# prob.driver.options['tol'] = 1.0e-12

prob.driver.add_desvar('t',
                       lower=numpy.ones((num_y)) * 0.001,
                       upper=numpy.ones((num_y)) * 0.25)
prob.driver.add_objective('energy')
prob.driver.add_constraint('weight', upper=1e5)

prob.root.deriv_options['type'] = 'cs'
prob.root.deriv_options['form'] = 'central'
prob.root.deriv_options['step_size'] = 1e-10

prob.driver.add_recorder(SqliteRecorder('spatialbeam.db'))

prob.setup()

view_tree(prob, outfile="prob1.html", show_browser=False)

# prob.run_once()
# prob.check_partial_derivatives(compact_print=True)

st = time.time()
prob.run()
print "run time", time.time() - st
Example #9
0
def omdaoGroup(record):
    print 'Executing multiple instances of OpenMDAO-defined FAST components in parallel'
    print ''

    # Parallel execution entails additional dependencies--be sure they are installed

    # If example = 3, be sure to run callv8Wrapper using RunParallel script file
    # or using equivalent mpi commands, otherwise cases will fun in serial.

    # Imports
    from runFAST_v8 import runFAST_v8
    from openmdao.api import Group, Problem, Component, IndepVarComp
    from openmdao.api import ParallelGroup, ParallelFDGroup
    from openmdao.core.mpi_wrap import MPI
    if MPI:
        from openmdao.core.petsc_impl import PetscImpl as impl
    else:
        from openmdao.core.basic_impl import BasicImpl as impl
    from FASTv8_aeroelasticsolver import FASTv8_Workflow, FASTv8_AeroElasticSolver

    # Initial OpenMDAO problem setup for parallel group
    top = Problem(impl=impl, root=ParallelFDGroup(1))  # use for parallel
    root = top.root

    # Setup input config dictionary of dictionaries.
    caseids = [
        'omdaoParallelCase1', 'omdaoParallelCase2', 'omdaoParallelCase3',
        'omdaoParallelCase4'
    ]
    DT = [
        0.01, 0.02, 0.025, 0.03
    ]  #multiple timestep sizes we wish to test--currently limited to even multiples of TMax
    cfg_master = {}  #master config dictionary (dictionary of dictionaries)

    for i in range(4):
        # Create dictionary for this particular case
        cfg = {}
        cfg['DT'] = DT[i]
        cfg['TMax'] = 60

        # fst_exe, fst_file, fst_dir same for all cases
        cfg['fst_exe'] = "../../../FAST_v8/bin/FAST_glin64"
        cfg['fst_dir'] = "TemplateTest/"
        cfg['fst_file'] = "Test18_.fst"

        # Put dictionary into master dictionary, keyed by caseid
        cfg_master[caseids[i]] = cfg

    # Add parallel group to omdao problem, pass in master config file
    root.add('FASTcases', FASTv8_AeroElasticSolver(cfg_master, caseids))

    # Set up recorder if desired (requires sqlite)
    if record:
        from openmdao.api import SqliteRecorder
        recorder = SqliteRecorder('omdaoparallel.sqlite')
        top.driver.add_recorder(recorder)

    top.setup()
    top.run()

    top.cleanup()  #Good practice, especially when using recorder
    top.driver.options['optimizer'] = 'SLSQP'
    top.driver.options['tol'] = 1.0e-8

    # This is for testing with SNOPT via pyOptSparse
    '''
    from openmdao.api import pyOptSparseDriver
    top.driver = pyOptSparseDriver()
    top.driver.options['optimizer'] = 'SNOPT'
    '''

    top.driver.add_desvar('z', lower=np.array([-10.0, 0.0]),
                         upper=np.array([10.0, 10.0]))
    top.driver.add_desvar('x', lower=0.0, upper=10.0)

    top.driver.add_objective('obj')
    top.driver.add_constraint('con1', upper=0.0)
    top.driver.add_constraint('con2', upper=0.0)
    rec = SqliteRecorder('sellar_snopt.db')
    top.driver.add_recorder(rec)
    rec.options['record_derivs'] = True

    top.setup()
    top.run()

    print("\n")
    print( "Minimum found at (%f, %f, %f)" % (top['z'][0],
                                             top['z'][1],
                                             top['x']))
    print("Coupling vars: %f, %f" % (top['y1'], top['y2']))
    print("Minimum objective: ", top['obj'])
    mda.nl_solver = NLGaussSeidel()
#    mda.nl_solver.options['rtol'] = 1.e-1
    mda.nl_solver.options['maxiter'] = 15
    mda.nl_solver.options['rutol'] = 1.e-2
    mda.nl_solver.options['use_aitken'] = True
    mda.nl_solver.options['aitken_alpha_min'] = 0.1
    mda.nl_solver.options['aitken_alpha_max'] = 1.5

    mda.ln_solver = ScipyGMRES()

    root.add('mda_group', mda, promotes=['*'])

    top.root.mda_group.deriv_options['type'] = 'fd'
    top.root.mda_group.deriv_options['step_size'] = 1.0e-1
    #Recorder
    recorder = SqliteRecorder('opti_g_11')
    recorder.options['record_params'] = False
    recorder.options['record_metadata'] = False
    recorder.options['record_resids'] = False
    recorder.options['record_derivs'] = False
    top.root.nl_solver.add_recorder(recorder)
#    top.root.add_recorder(recorder)


    #Define solver type

    root.add('obj_function', ExecComp('obj_f = mass'), promotes=['*'])
    
    t_max=0.01*np.ones(tn)
    t_min=0.006*np.ones(tn)
Example #12
0
    def setUpClass(cls):

        cls.traj = Trajectory()
        p = cls.p = Problem(model=cls.traj)

        # Since we're only testing features like get_values that don't rely on a converged
        # solution, no driver is attached.  We'll just invoke run_model.

        # First Phase (burn)

        burn1 = Phase(ode_class=FiniteBurnODE, transcription=GaussLobatto(num_segments=4, order=3))

        cls.traj.add_phase('burn1', burn1)

        burn1.set_time_options(fix_initial=True, duration_bounds=(.5, 10))
        burn1.set_state_options('r', fix_initial=True, fix_final=False)
        burn1.set_state_options('theta', fix_initial=True, fix_final=False)
        burn1.set_state_options('vr', fix_initial=True, fix_final=False, defect_scaler=0.1)
        burn1.set_state_options('vt', fix_initial=True, fix_final=False, defect_scaler=0.1)
        burn1.set_state_options('accel', fix_initial=True, fix_final=False)
        burn1.set_state_options('deltav', fix_initial=True, fix_final=False)
        burn1.add_control('u1', rate_continuity=True, rate2_continuity=True, units='deg')
        burn1.add_design_parameter('c', opt=False, val=1.5)

        # Second Phase (Coast)

        coast = Phase(ode_class=FiniteBurnODE, transcription=GaussLobatto(num_segments=10, order=3))

        cls.traj.add_phase('coast', coast)

        coast.set_time_options(initial_bounds=(0.5, 20), duration_bounds=(.5, 10))
        coast.set_state_options('r', fix_initial=False, fix_final=False)
        coast.set_state_options('theta', fix_initial=False, fix_final=False)
        coast.set_state_options('vr', fix_initial=False, fix_final=False)
        coast.set_state_options('vt', fix_initial=False, fix_final=False)
        coast.set_state_options('accel', fix_initial=True, fix_final=True)
        coast.set_state_options('deltav', fix_initial=False, fix_final=False)
        coast.add_control('u1', opt=False, val=0.0, units='deg')
        coast.add_design_parameter('c', opt=False, val=1.5)

        # Third Phase (burn)

        burn2 = Phase(ode_class=FiniteBurnODE, transcription=GaussLobatto(num_segments=3, order=3))

        cls.traj.add_phase('burn2', burn2)

        burn2.set_time_options(initial_bounds=(0.5, 20), duration_bounds=(.5, 10))
        burn2.set_state_options('r', fix_initial=False, fix_final=True, defect_scaler=1.0)
        burn2.set_state_options('theta', fix_initial=False, fix_final=False, defect_scaler=1.0)
        burn2.set_state_options('vr', fix_initial=False, fix_final=True, defect_scaler=0.1)
        burn2.set_state_options('vt', fix_initial=False, fix_final=True, defect_scaler=0.1)
        burn2.set_state_options('accel', fix_initial=False, fix_final=False, defect_scaler=1.0)
        burn2.set_state_options('deltav', fix_initial=False, fix_final=False, defect_scaler=1.0)
        burn2.add_control('u1', rate_continuity=True, rate2_continuity=True, units='deg',
                          ref0=0, ref=10)
        burn2.add_design_parameter('c', opt=False, val=1.5)

        burn2.add_objective('deltav', loc='final')

        # Link Phases
        cls.traj.link_phases(phases=['burn1', 'coast', 'burn2'],
                             vars=['time', 'r', 'theta', 'vr', 'vt', 'deltav'])
        cls.traj.link_phases(phases=['burn1', 'burn2'], vars=['accel'])

        # Finish Problem Setup
        p.model.linear_solver = DirectSolver()

        p.model.add_recorder(SqliteRecorder('test_trajectory_rec.db'))

        p.setup(check=True)

        # Set Initial Guesses

        p.set_val('burn1.t_initial', value=0.0)
        p.set_val('burn1.t_duration', value=2.25)

        p.set_val('burn1.states:r', value=burn1.interpolate(ys=[1, 1.5], nodes='state_input'))
        p.set_val('burn1.states:theta', value=burn1.interpolate(ys=[0, 1.7], nodes='state_input'))
        p.set_val('burn1.states:vr', value=burn1.interpolate(ys=[0, 0], nodes='state_input'))
        p.set_val('burn1.states:vt', value=burn1.interpolate(ys=[1, 1], nodes='state_input'))
        p.set_val('burn1.states:accel', value=burn1.interpolate(ys=[0.1, 0], nodes='state_input'))
        p.set_val('burn1.states:deltav', value=burn1.interpolate(ys=[0, 0.1], nodes='state_input'))
        p.set_val('burn1.controls:u1',
                  value=burn1.interpolate(ys=[-3.5, 13.0], nodes='control_input'))
        p.set_val('burn1.design_parameters:c', value=1.5)

        p.set_val('coast.t_initial', value=2.25)
        p.set_val('coast.t_duration', value=3.0)

        p.set_val('coast.states:r', value=coast.interpolate(ys=[1.3, 1.5], nodes='state_input'))
        p.set_val('coast.states:theta',
                  value=coast.interpolate(ys=[2.1767, 1.7], nodes='state_input'))
        p.set_val('coast.states:vr', value=coast.interpolate(ys=[0.3285, 0], nodes='state_input'))
        p.set_val('coast.states:vt', value=coast.interpolate(ys=[0.97, 1], nodes='state_input'))
        p.set_val('coast.states:accel', value=coast.interpolate(ys=[0, 0], nodes='state_input'))
        p.set_val('coast.controls:u1', value=coast.interpolate(ys=[0, 0], nodes='control_input'))
        p.set_val('coast.design_parameters:c', value=1.5)

        p.set_val('burn2.t_initial', value=5.25)
        p.set_val('burn2.t_duration', value=1.75)

        p.set_val('burn2.states:r', value=burn2.interpolate(ys=[1, 3], nodes='state_input'))
        p.set_val('burn2.states:theta', value=burn2.interpolate(ys=[0, 4.0], nodes='state_input'))
        p.set_val('burn2.states:vr', value=burn2.interpolate(ys=[0, 0], nodes='state_input'))
        p.set_val('burn2.states:vt',
                  value=burn2.interpolate(ys=[1, np.sqrt(1 / 3)], nodes='state_input'))
        p.set_val('burn2.states:accel', value=burn2.interpolate(ys=[0.1, 0], nodes='state_input'))
        p.set_val('burn2.states:deltav',
                  value=burn2.interpolate(ys=[0.1, 0.2], nodes='state_input'))
        p.set_val('burn2.controls:u1', value=burn2.interpolate(ys=[1, 1], nodes='control_input'))
        p.set_val('burn2.design_parameters:c', value=1.5)

        p.run_model()
Example #13
0
    def test_invalid_linkage_phase(self):
        p = Problem(model=Group())

        traj = Trajectory()
        p.model.add_subsystem('traj', subsys=traj)

        # Since we're only testing features like get_values that don't rely on a converged
        # solution, no driver is attached.  We'll just invoke run_model.

        # First Phase (burn)
        burn1 = Phase(ode_class=FiniteBurnODE, transcription=GaussLobatto(num_segments=4, order=3))

        traj.add_phase('burn1', burn1)

        burn1.set_time_options(fix_initial=True, duration_bounds=(.5, 10))
        burn1.set_state_options('r', fix_initial=True, fix_final=False)
        burn1.set_state_options('theta', fix_initial=True, fix_final=False)
        burn1.set_state_options('vr', fix_initial=True, fix_final=False, defect_scaler=0.1)
        burn1.set_state_options('vt', fix_initial=True, fix_final=False, defect_scaler=0.1)
        burn1.set_state_options('accel', fix_initial=True, fix_final=False)
        burn1.set_state_options('deltav', fix_initial=True, fix_final=False)
        burn1.add_control('u1', rate_continuity=True, rate2_continuity=True, units='deg')
        burn1.add_design_parameter('c', opt=False, val=1.5)

        # Second Phase (Coast)

        coast = Phase(ode_class=FiniteBurnODE, transcription=GaussLobatto(num_segments=10, order=3))

        traj.add_phase('coast', coast)

        coast.set_time_options(initial_bounds=(0.5, 20), duration_bounds=(.5, 10))
        coast.set_state_options('r', fix_initial=False, fix_final=False)
        coast.set_state_options('theta', fix_initial=False, fix_final=False)
        coast.set_state_options('vr', fix_initial=False, fix_final=False)
        coast.set_state_options('vt', fix_initial=False, fix_final=False)
        coast.set_state_options('accel', fix_initial=True, fix_final=True)
        coast.set_state_options('deltav', fix_initial=False, fix_final=False)
        coast.add_control('u1', opt=False, val=0.0, units='deg')
        coast.add_design_parameter('c', opt=False, val=1.5)

        # Third Phase (burn)

        burn2 = Phase(ode_class=FiniteBurnODE, transcription=GaussLobatto(num_segments=3, order=3))

        traj.add_phase('burn2', burn2)

        burn2.set_time_options(initial_bounds=(0.5, 20), duration_bounds=(.5, 10))
        burn2.set_state_options('r', fix_initial=False, fix_final=True, defect_scaler=1.0)
        burn2.set_state_options('theta', fix_initial=False, fix_final=False, defect_scaler=1.0)
        burn2.set_state_options('vr', fix_initial=False, fix_final=True, defect_scaler=0.1)
        burn2.set_state_options('vt', fix_initial=False, fix_final=True, defect_scaler=0.1)
        burn2.set_state_options('accel', fix_initial=False, fix_final=False, defect_scaler=1.0)
        burn2.set_state_options('deltav', fix_initial=False, fix_final=False, defect_scaler=1.0)
        burn2.add_control('u1', rate_continuity=True, rate2_continuity=True, units='deg',
                          ref0=0, ref=10)
        burn2.add_design_parameter('c', opt=False, val=1.5)

        burn2.add_objective('deltav', loc='final')

        # Link Phases
        traj.link_phases(phases=['burn1', 'coast', 'burn2'],
                         vars=['time', 'r', 'theta', 'vr', 'vt', 'deltav'])

        traj.link_phases(phases=['burn1', 'foo'], vars=['u1', 'u1'])

        # Finish Problem Setup
        p.model.linear_solver = DirectSolver()

        p.model.add_recorder(SqliteRecorder('test_trajectory_rec.db'))

        with self.assertRaises(ValueError) as e:
            p.setup(check=True)

        self.assertEqual(str(e.exception), 'Invalid linkage.  Phase \'foo\' does not exist in '
                                           'trajectory \'traj\'.')
def get_problem(surface, match_number=0.84, height=7000):
    # Create the problem and assign the model group
    prob = Problem()

    grav_constant = data_heights[height]['g']
    v = match_number * data_heights[height]['speed']
    re = data_heights[height]['ro'] * data_heights[height][
        'speed'] * match_number / data_heights[height]['visc']
    rho = data_heights[height]['ro']
    speed_of_sound = data_heights[height]['speed']

    indep_var_comp = IndepVarComp()
    indep_var_comp.add_output('v', val=v, units='m/s')  # change this too
    indep_var_comp.add_output('alpha', val=5., units='deg')
    indep_var_comp.add_output('Mach_number', val=match_number)
    indep_var_comp.add_output('re', val=re, units='1/m')  # change this too
    indep_var_comp.add_output('rho', val=rho, units='kg/m**3')
    indep_var_comp.add_output('CT', val=grav_constant * 17.e-6, units='1/s')
    indep_var_comp.add_output('R', val=11.165e6, units='m')
    indep_var_comp.add_output('W0', val=0.4 * 3e5, units='kg')
    indep_var_comp.add_output('speed_of_sound',
                              val=speed_of_sound,
                              units='m/s')
    indep_var_comp.add_output('load_factor', val=1.)
    indep_var_comp.add_output('empty_cg', val=np.zeros((3)), units='m')

    prob.model.add_subsystem('prob_vars', indep_var_comp, promotes=['*'])

    aerostruct_group = AerostructGeometry(surface=surface)

    name = 'wing'

    # Add tmp_group to the problem with the name of the surface.
    prob.model.add_subsystem(name, aerostruct_group)

    point_name = 'AS_point_0'

    # Create the aero point group and add it to the model
    AS_point = AerostructPoint(surfaces=[surface])

    prob.model.add_subsystem(point_name,
                             AS_point,
                             promotes_inputs=[
                                 'v', 'alpha', 'Mach_number', 're', 'rho',
                                 'CT', 'R', 'W0', 'speed_of_sound', 'empty_cg',
                                 'load_factor'
                             ])

    com_name = point_name + '.' + name + '_perf'
    prob.model.connect(
        name + '.local_stiff_transformed',
        point_name + '.coupled.' + name + '.local_stiff_transformed')
    prob.model.connect(name + '.nodes',
                       point_name + '.coupled.' + name + '.nodes')

    # Connect aerodyamic mesh to coupled group mesh
    prob.model.connect(name + '.mesh',
                       point_name + '.coupled.' + name + '.mesh')

    # Connect performance calculation variables
    prob.model.connect(name + '.radius', com_name + '.radius')
    prob.model.connect(name + '.thickness', com_name + '.thickness')
    prob.model.connect(name + '.nodes', com_name + '.nodes')
    prob.model.connect(
        name + '.cg_location',
        point_name + '.' + 'total_perf.' + name + '_cg_location')
    prob.model.connect(
        name + '.structural_mass',
        point_name + '.' + 'total_perf.' + name + '_structural_mass')
    prob.model.connect(name + '.t_over_c', com_name + '.t_over_c')

    prob.driver = ScipyOptimizeDriver()
    prob.driver.options['tol'] = 1e-9

    recorder = SqliteRecorder("aerostruct.db")
    prob.driver.add_recorder(recorder)
    prob.driver.recording_options['record_derivatives'] = True
    prob.driver.recording_options['includes'] = ['*']

    # Setup problem and add design variables, constraint, and objective
    # prob.model.add_design_var('wing.twist_cp', lower=-10., upper=15.)
    # prob.model.add_design_var('wing.thickness_cp', lower=0.01, upper=0.5, scaler=1e2)
    prob.model.add_constraint('AS_point_0.wing_perf.failure', upper=0.)
    prob.model.add_constraint('AS_point_0.wing_perf.thickness_intersects',
                              upper=0.)

    # Add design variables, constraisnt, and objective on the problem
    prob.model.add_design_var('alpha', lower=-10., upper=10.)
    prob.model.add_constraint('AS_point_0.L_equals_W', equals=0.)
    prob.model.add_objective('AS_point_0.fuelburn', scaler=1e-5)
    prob.setup(check=True)
    return prob
from betz_limit import Betz_Limit


if __name__ == "__main__":

    prob = Problem()
    prob.root = Betz_Limit()

    prob.driver = ScipyOptimizer()
    prob.driver.options['optimizer'] = 'SLSQP'
    prob.driver.options['tol'] = 1.0e-8

    prob.driver.add_desvar('a', lower=0.0, upper=1.0)
    prob.driver.add_desvar('Area', lower=0.0, upper=1.0)
    prob.driver.add_desvar('rho', lower=0.0, upper=1.0)
    prob.driver.add_desvar('Vu', lower=0.0, upper=1.0)

    # Scaler -1.0 so that we maximize.
    prob.driver.add_objective('aDisc.Cp', scaler=-1.0)

    recorder = SqliteRecorder('betz_limit.sql')
    #recorder.options['record_params'] = True
    recorder.options['record_resids'] = False

    prob.driver.add_recorder(recorder)

    prob.setup()
    prob.run()


Example #16
0
    def setup_prob(self):
        """
        Short method to select the optimizer. Uses pyOptSparse if available,
        or Scipy's SLSQP otherwise.
        """

        try:  # Use pyOptSparse optimizer if installed
            from openmdao.api import pyOptSparseDriver
            self.prob.driver = pyOptSparseDriver()
            if self.prob_dict['optimizer'] == 'SNOPT':
                self.prob.driver.options['optimizer'] = "SNOPT"
                self.prob.driver.opt_settings = {'Major optimality tolerance': 1.0e-8,
                                                 'Major feasibility tolerance': 1.0e-8,
                                                 'Major iterations limit':400,
                                                 'Minor iterations limit':2000,
                                                 'Iterations limit':1000
                                                 }
            elif self.prob_dict['optimizer'] == 'ALPSO':
                self.prob.driver.options['optimizer'] = 'ALPSO'
                self.prob.driver.opt_settings = {'SwarmSize': 40,
                                                'maxOuterIter': 200,
                                                'maxInnerIter': 6,
                                                'rtol': 1e-5,
                                                'atol': 1e-5,
                                                'dtol': 1e-5,
                                                'printOuterIters': 1
                                                 }
            elif self.prob_dict['optimizer'] == 'NOMAD':
                self.prob.driver.options['optimizer'] = 'NOMAD'
                self.prob.driver.opt_settings = {'maxiter':1000,
                                                'minmeshsize':1e-12,
                                                'minpollsize':1e-12,
                                                'displaydegree':0,
                                                'printfile':1
                                                }
            elif self.prob_dict['optimizer'] == 'SLSQP':
                self.prob.driver.options['optimizer'] = 'SLSQP'
                self.prob.driver.opt_settings = {'ACC' : 1e-10
                                                }

        except:  # Use Scipy SLSQP optimizer if pyOptSparse not installed
            self.prob.driver = ScipyOptimizer()
            self.prob.driver.options['optimizer'] = 'SLSQP'
            self.prob.driver.options['disp'] = True
            self.prob.driver.options['tol'] = 1.0e-10

        # Actually call the OpenMDAO functions to add the design variables,
        # constraints, and objective.
        for desvar_name, desvar_data in iteritems(self.desvars):
            self.prob.driver.add_desvar(desvar_name, **desvar_data)
        for con_name, con_data in iteritems(self.constraints):
            self.prob.driver.add_constraint(con_name, **con_data)
        for obj_name, obj_data in iteritems(self.objective):
            self.prob.driver.add_objective(obj_name, **obj_data)

        # Use finite differences over the entire model if user selected it
        if self.prob_dict['force_fd']:
            self.prob.root.deriv_options['type'] = 'fd'

        # Record optimization history to a database.
        # Data saved here can be examined using `plot_all.py` or `OptView.py`
        if self.prob_dict['record_db']:
            recorder = SqliteRecorder(self.prob_dict['prob_name']+".db")
            recorder.options['record_params'] = True
            recorder.options['record_derivs'] = True
            self.prob.driver.add_recorder(recorder)

        # Profile (time) the problem
        if self.prob_dict['profile']:
            profile.setup(self.prob)
            profile.start()

        # Set up the problem
        self.prob.setup()

        # Use warm start from previous db file if desired.
        # Note that we only have access to the unknowns, not the gradient history.
        if self.prob_dict['previous_case_db'] is not None:

            # Open the previous case and start from the last iteration.
            # Change the -1 value in get_case() if you want to select a different iteration.
            cr = CaseReader(self.prob_dict['previous_case_db'])
            case = cr.get_case(-1)

            # Loop through the unknowns and set them for this problem.
            for param_name, param_data in iteritems(case.unknowns):
                self.prob[param_name] = param_data
    def test(self):
        from openaerostruct.geometry.utils import generate_mesh, write_FFD_file

        from openaerostruct.integration.aerostruct_groups import AerostructGeometry, AerostructPoint

        from openmdao.api import IndepVarComp, Problem, Group, SqliteRecorder
        from pygeo import DVGeometry


        # Create a dictionary to store options about the surface
        mesh_dict = {'num_y' : 5,
                     'num_x' : 2,
                     'wing_type' : 'CRM',
                     'symmetry' : True,
                     'num_twist_cp' : 5}

        mesh, twist_cp = generate_mesh(mesh_dict)

        surf_dict = {
                    # Wing definition
                    'name' : 'wing',        # name of the surface
                    'symmetry' : True,     # if true, model one half of wing
                                            # reflected across the plane y = 0
                    'S_ref_type' : 'wetted', # how we compute the wing area,
                                             # can be 'wetted' or 'projected'
                    'fem_model_type' : 'tube',

                    'thickness_cp' : np.array([.1, .2, .3]),

                    'mesh' : mesh,

                    'geom_manipulator' : 'FFD',
                    'mx' : 2,
                    'my' : 3,

                    # Aerodynamic performance of the lifting surface at
                    # an angle of attack of 0 (alpha=0).
                    # These CL0 and CD0 values are added to the CL and CD
                    # obtained from aerodynamic analysis of the surface to get
                    # the total CL and CD.
                    # These CL0 and CD0 values do not vary wrt alpha.
                    'CL0' : 0.0,            # CL of the surface at alpha=0
                    'CD0' : 0.015,            # CD of the surface at alpha=0

                    # Airfoil properties for viscous drag calculation
                    'k_lam' : 0.05,         # percentage of chord with laminar
                                            # flow, used for viscous drag
                    't_over_c_cp' : np.array([0.15]),      # thickness over chord ratio (NACA0015)
                    'c_max_t' : .303,       # chordwise location of maximum (NACA0015)
                                            # thickness
                    'with_viscous' : True,
                    'with_wave' : False,     # if true, compute wave drag

                    # Structural values are based on aluminum 7075
                    'E' : 70.e9,            # [Pa] Young's modulus of the spar
                    'G' : 30.e9,            # [Pa] shear modulus of the spar
                    'yield' : 500.e6 / 2.5, # [Pa] yield stress divided by 2.5 for limiting case
                    'mrho' : 3.e3,          # [kg/m^3] material density
                    'fem_origin' : 0.35,    # normalized chordwise location of the spar
                    'wing_weight_ratio' : 2.,
                    'struct_weight_relief' : False,    # True to add the weight of the structure to the loads on the structure
                    'distributed_fuel_weight' : False,
                    # Constraints
                    'exact_failure_constraint' : False, # if false, use KS function
                    }

        surfaces = [surf_dict]

        # Create the problem and assign the model group
        prob = Problem()

        # Add problem information as an independent variables component
        indep_var_comp = IndepVarComp()
        indep_var_comp.add_output('v', val=248.136, units='m/s')
        indep_var_comp.add_output('alpha', val=5., units='deg')
        indep_var_comp.add_output('Mach_number', val=0.84)
        indep_var_comp.add_output('re', val=1.e6, units='1/m')
        indep_var_comp.add_output('rho', val=0.38, units='kg/m**3')
        indep_var_comp.add_output('CT', val=9.80665 * 17.e-6, units='1/s')
        indep_var_comp.add_output('R', val=11.165e6, units='m')
        indep_var_comp.add_output('W0', val=0.4 * 3e5,  units='kg')
        indep_var_comp.add_output('speed_of_sound', val=295.4, units='m/s')
        indep_var_comp.add_output('load_factor', val=1.)
        indep_var_comp.add_output('empty_cg', val=np.zeros((3)), units='m')

        prob.model.add_subsystem('prob_vars',
             indep_var_comp,
             promotes=['*'])

        # Loop over each surface in the surfaces list
        for surface in surfaces:

            # Get the surface name and create a group to contain components
            # only for this surface
            name = surface['name']

            filename = write_FFD_file(surface, surface['mx'], surface['my'])
            DVGeo = DVGeometry(filename)
            aerostruct_group = AerostructGeometry(surface=surface, DVGeo=DVGeo)

            # Add tmp_group to the problem with the name of the surface.
            prob.model.add_subsystem(name, aerostruct_group)

        # Loop through and add a certain number of aero points
        for i in range(1):

            point_name = 'AS_point_{}'.format(i)
            # Connect the parameters within the model for each aero point

            # Create the aero point group and add it to the model
            AS_point = AerostructPoint(surfaces=surfaces)

            prob.model.add_subsystem(point_name, AS_point)

            # Connect flow properties to the analysis point
            prob.model.connect('v', point_name + '.v')
            prob.model.connect('alpha', point_name + '.alpha')
            prob.model.connect('Mach_number', point_name + '.Mach_number')
            prob.model.connect('re', point_name + '.re')
            prob.model.connect('rho', point_name + '.rho')
            prob.model.connect('CT', point_name + '.CT')
            prob.model.connect('R', point_name + '.R')
            prob.model.connect('W0', point_name + '.W0')
            prob.model.connect('speed_of_sound', point_name + '.speed_of_sound')
            prob.model.connect('empty_cg', point_name + '.empty_cg')
            prob.model.connect('load_factor', point_name + '.load_factor')

            for surface in surfaces:

                prob.model.connect('load_factor', name + '.load_factor')

                com_name = point_name + '.' + name + '_perf'
                prob.model.connect(name + '.local_stiff_transformed', point_name + '.coupled.' + name + '.local_stiff_transformed')
                prob.model.connect(name + '.nodes', point_name + '.coupled.' + name + '.nodes')

                # Connect aerodyamic mesh to coupled group mesh
                prob.model.connect(name + '.mesh', point_name + '.coupled.' + name + '.mesh')

                # Connect performance calculation variables
                prob.model.connect(name + '.radius', com_name + '.radius')
                prob.model.connect(name + '.thickness', com_name + '.thickness')
                prob.model.connect(name + '.nodes', com_name + '.nodes')
                prob.model.connect(name + '.cg_location', point_name + '.' + 'total_perf.' + name + '_cg_location')
                prob.model.connect(name + '.structural_weight', point_name + '.' + 'total_perf.' + name + '_structural_weight')
                prob.model.connect(name + '.t_over_c', com_name + '.t_over_c')

        # Import the Scipy Optimizer and set the driver of the problem to use
        # it, which defaults to an SLSQP optimization method
        from openmdao.api import ScipyOptimizeDriver
        prob.driver = ScipyOptimizeDriver()

        recorder = SqliteRecorder("aerostruct_ffd.db")
        prob.driver.add_recorder(recorder)
        prob.driver.recording_options['record_derivatives'] = True
        prob.driver.recording_options['includes'] = ['*']

        # Setup problem and add design variables, constraint, and objective
        prob.model.add_design_var('wing.shape', lower=-3, upper=2)
        prob.model.add_design_var('wing.thickness_cp', lower=0.01, upper=0.5, scaler=1e2)
        prob.model.add_constraint('AS_point_0.wing_perf.failure', upper=0.)
        prob.model.add_constraint('AS_point_0.wing_perf.thickness_intersects', upper=0.)

        # Add design variables, constraisnt, and objective on the problem
        prob.model.add_design_var('alpha', lower=-10., upper=10.)
        prob.model.add_constraint('AS_point_0.L_equals_W', equals=0.)
        prob.model.add_objective('AS_point_0.fuelburn', scaler=1e-5)

        # iprofile.setup()
        # iprofile.start()

        # Set up the problem
        prob.setup()

        # from openmdao.api import view_model
        # view_model(prob, outfile='aerostruct_ffd', show_browser=False)

        # prob.run_model()
        prob.run_driver()

        # prob.check_partials(compact_print=True)

        # print("\nWing CL:", prob['aero_point_0.wing_perf.CL'])
        # print("Wing CD:", prob['aero_point_0.wing_perf.CD'])


        # from helper import plot_3d_points
        #
        # mesh = prob['aero_point_0.wing.def_mesh']
        # plot_3d_points(mesh)
        #
        # filename = mesh_dict['wing_type'] + '_' + str(mesh_dict['num_x']) + '_' + str(mesh_dict['num_y'])
        # filename += '_' + str(surf_dict['mx']) + '_' + str(surf_dict['my']) + '.mesh'
        # np.save(filename, mesh)

        assert_rel_error(self, prob['AS_point_0.fuelburn'][0], 104675.0989232741, 1e-3)
    def test(self):

        # Create a dictionary to store options about the surface
        mesh_dict = {
            'num_y': 11,
            'num_x': 3,
            'wing_type': 'CRM',
            'symmetry': False,
            'num_twist_cp': 5
        }

        mesh, twist_cp = generate_mesh(mesh_dict)

        surf_dict = {
            # Wing definition
            'name': 'wing',  # name of the surface
            'type': 'aero',
            'symmetry': False,  # if true, model one half of wing
            # reflected across the plane y = 0
            'S_ref_type': 'wetted',  # how we compute the wing area,
            # can be 'wetted' or 'projected'
            'mesh': mesh,
            'num_x': mesh.shape[0],
            'num_y': mesh.shape[1],
            'twist_cp': twist_cp,

            # Aerodynamic performance of the lifting surface at
            # an angle of attack of 0 (alpha=0).
            # These CL0 and CD0 values are added to the CL and CD
            # obtained from aerodynamic analysis of the surface to get
            # the total CL and CD.
            # These CL0 and CD0 values do not vary wrt alpha.
            'CL0': 0.0,  # CL of the surface at alpha=0
            'CD0': 0.0,  # CD of the surface at alpha=0

            # Airfoil properties for viscous drag calculation
            'k_lam': 0.05,  # percentage of chord with laminar
            # flow, used for viscous drag
            't_over_c_cp':
            np.array([0.15]),  # thickness over chord ratio (NACA0015)
            'c_max_t': .303,  # chordwise location of maximum (NACA0015)
            # thickness
            'with_viscous': True,  # if true, compute viscous drag
            'with_wave': True,  # if true, compute wave drag
        }

        surfaces = [surf_dict]

        # Create the problem and the model group
        prob = Problem()

        indep_var_comp = IndepVarComp()
        indep_var_comp.add_output('v', val=248.136, units='m/s')
        indep_var_comp.add_output('alpha', val=5., units='deg')
        indep_var_comp.add_output('M', val=0.84)
        indep_var_comp.add_output('re', val=1.e6, units='1/m')
        indep_var_comp.add_output('rho', val=0.38, units='kg/m**3')
        indep_var_comp.add_output('cg', val=np.zeros((3)), units='m')

        prob.model.add_subsystem('prob_vars', indep_var_comp, promotes=['*'])

        # Loop over each surface in the surfaces list
        for surface in surfaces:

            geom_group = Geometry(surface=surface)

            # Add tmp_group to the problem as the name of the surface.
            # Note that is a group and performance group for each
            # individual surface.
            prob.model.add_subsystem(surface['name'], geom_group)

        # Loop through and add a certain number of aero points
        for i in range(1):

            # Create the aero point group and add it to the model
            aero_group = AeroPoint(surfaces=surfaces)
            point_name = 'aero_point_{}'.format(i)
            prob.model.add_subsystem(point_name, aero_group)

            # Connect flow properties to the analysis point
            prob.model.connect('v', point_name + '.v')
            prob.model.connect('alpha', point_name + '.alpha')
            prob.model.connect('M', point_name + '.M')
            prob.model.connect('re', point_name + '.re')
            prob.model.connect('rho', point_name + '.rho')
            prob.model.connect('cg', point_name + '.cg')

            # Connect the parameters within the model for each aero point
            for surface in surfaces:

                name = surface['name']

                # Connect the mesh from the geometry component to the analysis point
                prob.model.connect(name + '.mesh',
                                   point_name + '.' + name + '.def_mesh')

                # Perform the connections with the modified names within the
                # 'aero_states' group.
                prob.model.connect(
                    name + '.mesh',
                    point_name + '.aero_states.' + name + '_def_mesh')

                prob.model.connect(
                    name + '.t_over_c',
                    point_name + '.' + name + '_perf.' + 't_over_c')

        from openmdao.api import ScipyOptimizeDriver
        prob.driver = ScipyOptimizeDriver()
        prob.driver.options['tol'] = 1e-9

        recorder = SqliteRecorder("aero_opt_wavedrag.db")
        prob.driver.add_recorder(recorder)
        prob.driver.recording_options['record_derivatives'] = True

        # Setup problem and add design variables, constraint, and objective
        prob.model.add_design_var('wing.twist_cp', lower=-10., upper=15.)
        prob.model.add_constraint(point_name + '.wing_perf.CL', equals=0.5)
        prob.model.add_objective(point_name + '.wing_perf.CD', scaler=1e4)

        # Set up the problem
        prob.setup()

        prob.run_driver()

        assert_rel_error(self, prob['aero_point_0.wing_perf.CL'][0], 0.5, 1e-6)
        assert_rel_error(self, prob['aero_point_0.wing_perf.CD'][0],
                         0.02257921, 1e-6)
        assert_rel_error(self, prob['aero_point_0.CM'][1], -0.179451279, 1e-6)
Example #19
0
    ])
    #Connect Indep Variables
    root.connect('Mach_number.Mach', 'aerodynamics_h.Mach')
    root.connect('b_baseline', 'aerodynamics_h.b')
    root.connect('wing_chord.c', 'aerodynamics_h.c')
    root.connect('Poissons_ratio.nu', 'structures_h.nu')
    root.connect('Youngs_modulus.E', 'structures_h.E')
    root.connect('material_density.rho_s', 'structures_h.rho_s')

    #Multifidelity explicit connections

    root.connect('structures.u', 'mult_filter_h.ul')
    root.connect('structures_h.u', 'mult_filter_l.ul')

    #Recorder Lo-Fi
    recorder_l = SqliteRecorder('mda_l.sqlite3')
    recorder_l.options['record_metadata'] = False
    #Recorder Hi-Fi
    recorder_h = SqliteRecorder('mda_h.sqlite3')
    recorder_h.options['record_metadata'] = False
    top.root.mda_group_l.nl_solver.add_recorder(recorder_l)
    top.root.mda_group_h.nl_solver.add_recorder(recorder_h)

    #Constraint components
    #Lift coefficient constraints (two constraints with same value to treat equality constraint as two inequality constraints)
    root.add(
        'con_lift_cruise_upper',
        ExecComp(
            'con_l_u = CL - n*(W_airframe+2*1.25*mass)*9.81/(0.5*rho_a*V**2*Sw)'
        ),
        promotes=['*'])
Example #20
0
    #                        upper=secondTurbineXInitialPosition)
    # prob.driver.add_desvar('turbineY2', scaler=1E1, lower=secondTurbineYInitialPosition,
    #                        upper=secondTurbineYInitialPosition)
    # prob.driver.add_desvar('turbineX3', scaler=1E1, lower=secondTurbineXInitialPosition,
    #                        upper=secondTurbineXInitialPosition)
    # prob.driver.add_desvar('turbineY3', scaler=1E1, lower=np.ones(nTurbines) * -3. * boundary_radius,
    #                        upper=np.ones(nTurbines) * 3. * boundary_radius)

    prob.root.ln_solver.options['single_voi_relevance_reduction'] = True
    prob.root.ln_solver.options['mode'] = 'rev'

    # Import OpenMDAO's recorder to track the downwind turbine's movements during the optimization.
    # Good to use for small cases like this debugger, but not for large scale problems.
    from openmdao.api import SqliteRecorder
    import sqlitedict
    recorder = SqliteRecorder('AEP')
    recorder.options['includes'] = ['turbineX', 'turbineY']
    prob.driver.add_recorder(recorder)

    # Begin setting up the problem and running it.
    print("almost time for setup")
    tic = time.time()
    print("entering setup at time = ", tic)
    prob.setup(check=True)
    toc = time.time()
    mpi_print(prob, "setup complete at time = ", toc)

    # print the results
    mpi_print(prob, ('Problem setup took %.03f sec.' % (toc - tic)))

    # assign initial values to design variables
Example #21
0
 top.root.connect('indep3.cruiseSpeed', 'subprob.indep3.cruiseSpeed')
 top.root.connect('indep4.batteryMass', 'subprob.indep4.batteryMass')
 top.root.connect('indep5.motorMass', 'subprob.indep5.motorMass')
 top.root.connect('indep6.mtom', 'subprob.indep6.mtom')
 
 # TopProblem: set up the parameter study
 # for a parameter study, the following drivers can be used:
 # UniformDriver, FullFactorialDriver, LatinHypercubeDriver, OptimizedLatinHypercubeDriver
 # in this case, we will use FullFactorialDriver
 top.driver = FullFactorialDriver(num_levels=20)
 
 # TopProblem: add top.driver's design variables
 top.driver.add_desvar('indep1.range', lower=10000.0, upper=200000.0)
 
 # Data collection
 recorder = SqliteRecorder('subprob')
 recorder.options['record_params'] = True
 recorder.options['record_metadata'] = True
 top.driver.add_recorder(recorder)
 
 # Setup
 top.setup(check=False)
 
 # Run 
 top.run()
 
 # Cleanup
 top.cleanup()
 
 # Data retrieval & display
 # Old way - good for debugging IndepVars
Example #22
0
from openmdao.api import Problem, SqliteRecorder
from openmdao.test_suite.components.sellar import SellarProblem, SellarDerivativesGrouped
from openmdao.drivers.pyoptsparse_driver import pyOptSparseDriver

recorder = SqliteRecorder("sellar_grouped.db")

prob = SellarProblem(SellarDerivativesGrouped)
driver = prob.driver = pyOptSparseDriver(optimizer='SLSQP')

prob.model.add_recorder(recorder, True)
driver.add_recorder(recorder)

prob.setup()
prob.run_driver()
prob.cleanup()
Example #23
0
                  help="run doe in parallel")
(options, args) = parser.parse_args()

pb = Problem(SsbjMda())
sa_method_name = 'Morris'
sa_doe_options = {'n_trajs': 10, 'n_levels': 4}
if options.sobol:
    sa_method_name = 'Sobol'
    sa_doe_options = {'n_samples': 500, 'calc_second_order': False}

pb.driver = SalibDOEDriver(sa_method_name=sa_method_name,
                           sa_doe_options=sa_doe_options)
pb.driver.options['run_parallel'] = options.parallel

case_recorder_filename = 'ssbj_mda_screening.sqlite'
recorder = SqliteRecorder(case_recorder_filename)
pb.driver.add_recorder(recorder)

pb.model.nonlinear_solver.options['err_on_non_converge'] = True

pb.model.add_design_var('x_aer', lower=0.75, upper=1.25)
pb.model.add_design_var('x_pro', lower=0.18, upper=1.81)
pb.model.add_design_var('x_str', lower=[0.4, 0.75], upper=[1.6, 1.25])
pb.model.add_design_var('z',
                        lower=[0.2, 0.666, 0.875, 0.45, 0.72, 0.5],
                        upper=[1.8, 1.333, 1.125, 1.45, 1.27, 1.5])

pb.model.add_objective('R', scaler=-1.)

pb.model.add_constraint('con1_esf', upper=0.)
pb.model.add_constraint('con2_esf', upper=0.)
Example #24
0
                prob.driver = ScipyOptimizeDriver()
                prob.driver.options['dynamic_simul_derivs'] = True
                #prob.driver.options['tol'] = 1e-13
                if write_logs:
                    filename_to_save = 'case_' + str(spec_energy) + '_' + str(
                        design_range) + '.sql'
                    if os.path.isfile(filename_to_save):
                        if design_range != 300:
                            last_successful_opt = filename_to_save
                        else:
                            last_successful_opt = 'case_' + str(
                                spec_energy + 50) + '_' + str(700) + '.sql'
                        print('Skipping ' + filename_to_save)
                        continue
                    recorder = SqliteRecorder(filename_to_save)
                    prob.driver.add_recorder(recorder)
                    prob.driver.recording_options['includes'] = []
                    prob.driver.recording_options['record_objectives'] = True
                    prob.driver.recording_options['record_constraints'] = True
                    prob.driver.recording_options['record_desvars'] = True

                prob.setup(check=False)
                # set some (required) mission parameters. Each pahse needs a vertical and air-speed
                # the entire mission needs a cruise altitude and range
                prob.set_val('climb.fltcond|vs',
                             np.ones((num_nodes, )) * 1500,
                             units='ft/min')
                prob.set_val('climb.fltcond|Ueas',
                             np.ones((num_nodes, )) * 124,
                             units='kn')
 def setUp(self):
     self.dir = mkdtemp()
     self.filename = os.path.join(self.dir, "sqlite_test")
     self.recorder = SqliteRecorder(self.filename)
     self.eps = 1e-5
Example #26
0
try:  # Use SNOPT optimizer if installed
    from openmdao.api import pyOptSparseDriver
    prob.driver = pyOptSparseDriver()
    prob.driver.options['optimizer'] = "SNOPT"
    prob.driver.opt_settings = {
        'Major optimality tolerance': 1.0e-7,
        'Major feasibility tolerance': 1.0e-7
    }
except:  # Use SLSQP optimizer if SNOPT not installed
    prob.driver = ScipyOptimizer()
    prob.driver.options['optimizer'] = 'SLSQP'
    prob.driver.options['disp'] = True
    prob.driver.options['tol'] = 1.0e-3
    prob.driver.options['maxiter'] = 40

prob.driver.add_recorder(SqliteRecorder('aerostruct.db'))

###############################################################
# Add design vars
###############################################################
prob.driver.add_desvar('twist_cp', lower=-10., upper=10., scaler=1e0)
prob.driver.add_desvar('alpha', lower=-10., upper=10., scaler=1e0)
prob.driver.add_desvar('thickness_cp', lower=0.003, upper=0.25, scaler=1000)

###############################################################
# Add constraints, and objectives
###############################################################
prob.driver.add_objective('fuelburn')
prob.driver.add_constraint('failure', upper=0.0)
prob.driver.add_constraint('eq_con', equals=0.0)
Example #27
0
## Use these settings if you do not have pyOptSparse or SNOPT
prob.driver = ScipyOptimizeDriver()
prob.driver.options['optimizer'] = 'SLSQP'
prob.driver.options['tol'] = 1e-8

# # The following are the optimizer settings used for the EngOpt conference paper
# # Uncomment them if you can use SNOPT
# from openmdao.api import pyOptSparseDriver
# prob.driver = pyOptSparseDriver()
# prob.driver.options['optimizer'] = "SNOPT"
# prob.driver.opt_settings['Major optimality tolerance'] = 5e-6
# prob.driver.opt_settings['Major feasibility tolerance'] = 1e-8
# prob.driver.opt_settings['Major iterations limit'] = 200

recorder = SqliteRecorder("aerostruct.db")
prob.driver.add_recorder(recorder)

# We could also just use prob.driver.recording_options['includes']=['*'] here, but for large meshes the database file becomes extremely large. So we just select the variables we need.
prob.driver.recording_options['includes'] = [
    'alpha',
    'rho',
    'v',
    'cg',
    'AS_point_1.cg',
    'AS_point_0.cg',
    'AS_point_0.coupled.wing_loads.loads',
    'AS_point_1.coupled.wing_loads.loads',
    'AS_point_0.coupled.wing.normals',
    'AS_point_1.coupled.wing.normals',
    'AS_point_0.coupled.wing.widths',
Example #28
0
    # Add driver
    OptimizationProfilerRepeat.driver = FullFactorialDriver(
        num_levels=10)  # generate 10 profiler samples
    OptimizationProfilerRepeat.driver.add_desvar('p1.n', lower=0.0, upper=10.0)
    OptimizationProfilerRepeat.driver.add_objective(
        'OptimizationProfiler.MeasureTime.time')
    OptimizationProfilerRepeat.driver.add_objective(
        'OptimizationProfiler.OptimizationProblem.Paraboloid.f_xy')
    OptimizationProfilerRepeat.driver.add_objective(
        'OptimizationProfiler.OptimizationProblem.output1.x_f')
    OptimizationProfilerRepeat.driver.add_objective(
        'OptimizationProfiler.OptimizationProblem.output2.y_f')

    # Data collection
    recorder = SqliteRecorder('record_results')
    recorder.options['record_params'] = True
    recorder.options['record_metadata'] = True
    OptimizationProfilerRepeat.driver.add_recorder(recorder)

    # Setup
    OptimizationProfilerRepeat.setup(check=False)

    # Run
    OptimizationProfilerRepeat.run()

    # Cleanup
    OptimizationProfilerRepeat.cleanup()

    # Data retrieval & display
    # Old way - good for debugging IndepVars
Example #29
0
    def test_two_burn_orbit_raise_for_docs(self):
        import numpy as np

        import matplotlib.pyplot as plt

        from openmdao.api import Problem, pyOptSparseDriver, DirectSolver, SqliteRecorder
        from openmdao.utils.assert_utils import assert_rel_error
        from openmdao.utils.general_utils import set_pyoptsparse_opt

        from dymos import Phase, Trajectory
        from dymos.examples.finite_burn_orbit_raise.finite_burn_eom import FiniteBurnODE

        traj = Trajectory()
        p = Problem(model=traj)

        p.driver = pyOptSparseDriver()
        _, optimizer = set_pyoptsparse_opt('SNOPT', fallback=False)
        p.driver.options['optimizer'] = 'SNOPT'
        p.driver.options['dynamic_simul_derivs'] = True

        traj.add_design_parameter('c', opt=False, val=1.5)

        # First Phase (burn)

        burn1 = Phase('gauss-lobatto',
                      ode_class=FiniteBurnODE,
                      num_segments=10,
                      transcription_order=3,
                      compressed=True)

        burn1 = traj.add_phase('burn1', burn1)

        burn1.set_time_options(fix_initial=True, duration_bounds=(.5, 10))
        burn1.set_state_options('r',
                                fix_initial=True,
                                fix_final=False,
                                defect_scaler=100.0)
        burn1.set_state_options('theta',
                                fix_initial=True,
                                fix_final=False,
                                defect_scaler=100.0)
        burn1.set_state_options('vr',
                                fix_initial=True,
                                fix_final=False,
                                defect_scaler=100.0)
        burn1.set_state_options('vt',
                                fix_initial=True,
                                fix_final=False,
                                defect_scaler=100.0)
        burn1.set_state_options('accel', fix_initial=True, fix_final=False)
        burn1.set_state_options('deltav', fix_initial=True, fix_final=False)
        burn1.add_control('u1',
                          rate_continuity=True,
                          rate2_continuity=True,
                          units='deg',
                          scaler=0.01,
                          rate_continuity_scaler=0.001,
                          rate2_continuity_scaler=0.001,
                          lower=-30,
                          upper=30)

        # Second Phase (Coast)

        coast = Phase('gauss-lobatto',
                      ode_class=FiniteBurnODE,
                      num_segments=10,
                      transcription_order=3,
                      compressed=True)

        traj.add_phase('coast', coast)

        coast.set_time_options(initial_bounds=(0.5, 20),
                               duration_bounds=(.5, 10),
                               duration_ref=10)
        coast.set_state_options('r',
                                fix_initial=False,
                                fix_final=False,
                                defect_scaler=100.0)
        coast.set_state_options('theta',
                                fix_initial=False,
                                fix_final=False,
                                defect_scaler=100.0)
        coast.set_state_options('vr',
                                fix_initial=False,
                                fix_final=False,
                                defect_scaler=100.0)
        coast.set_state_options('vt',
                                fix_initial=False,
                                fix_final=False,
                                defect_scaler=100.0)
        coast.set_state_options('accel', fix_initial=True, fix_final=True)
        coast.set_state_options('deltav', fix_initial=False, fix_final=False)
        coast.add_control('u1', opt=False, val=0.0, units='deg')

        # Third Phase (burn)

        burn2 = Phase('gauss-lobatto',
                      ode_class=FiniteBurnODE,
                      num_segments=10,
                      transcription_order=3,
                      compressed=True)

        traj.add_phase('burn2', burn2)

        burn2.set_time_options(initial_bounds=(0.5, 20),
                               duration_bounds=(.5, 10),
                               initial_ref=10)
        burn2.set_state_options('r',
                                fix_initial=False,
                                fix_final=True,
                                defect_scaler=100.0)
        burn2.set_state_options('theta',
                                fix_initial=False,
                                fix_final=False,
                                defect_scaler=100.0)
        burn2.set_state_options('vr',
                                fix_initial=False,
                                fix_final=True,
                                defect_scaler=100.0)
        burn2.set_state_options('vt',
                                fix_initial=False,
                                fix_final=True,
                                defect_scaler=100.0)
        burn2.set_state_options('accel',
                                fix_initial=False,
                                fix_final=False,
                                defect_scaler=1.0)
        burn2.set_state_options('deltav',
                                fix_initial=False,
                                fix_final=False,
                                defect_scaler=1.0)
        burn2.add_control('u1',
                          rate_continuity=True,
                          rate2_continuity=True,
                          units='deg',
                          scaler=0.01,
                          rate_continuity_scaler=0.001,
                          rate2_continuity_scaler=0.001,
                          lower=-30,
                          upper=30)

        burn2.add_objective('deltav', loc='final', scaler=1.0)

        # Link Phases
        traj.link_phases(phases=['burn1', 'coast', 'burn2'],
                         vars=['time', 'r', 'theta', 'vr', 'vt', 'deltav'])
        traj.link_phases(phases=['burn1', 'burn2'], vars=['accel'])

        # Finish Problem Setup

        p.model.options['assembled_jac_type'] = 'csc'
        p.model.linear_solver = DirectSolver(assemble_jac=True)

        p.driver.add_recorder(
            SqliteRecorder('two_burn_orbit_raise_example_for_docs.db'))

        p.setup(check=True)

        # Set Initial Guesses
        p.set_val('design_parameters:c', value=1.5)

        p.set_val('burn1.t_initial', value=0.0)
        p.set_val('burn1.t_duration', value=2.25)

        p.set_val('burn1.states:r',
                  value=burn1.interpolate(ys=[1, 1.5], nodes='state_input'))
        p.set_val('burn1.states:theta',
                  value=burn1.interpolate(ys=[0, 1.7], nodes='state_input'))
        p.set_val('burn1.states:vr',
                  value=burn1.interpolate(ys=[0, 0], nodes='state_input'))
        p.set_val('burn1.states:vt',
                  value=burn1.interpolate(ys=[1, 1], nodes='state_input'))
        p.set_val('burn1.states:accel',
                  value=burn1.interpolate(ys=[0.1, 0], nodes='state_input'))
        p.set_val(
            'burn1.states:deltav',
            value=burn1.interpolate(ys=[0, 0.1], nodes='state_input'),
        )
        p.set_val('burn1.controls:u1',
                  value=burn1.interpolate(ys=[-3.5, 13.0],
                                          nodes='control_input'))

        p.set_val('coast.t_initial', value=2.25)
        p.set_val('coast.t_duration', value=3.0)

        p.set_val('coast.states:r',
                  value=coast.interpolate(ys=[1.3, 1.5], nodes='state_input'))
        p.set_val('coast.states:theta',
                  value=coast.interpolate(ys=[2.1767, 1.7],
                                          nodes='state_input'))
        p.set_val('coast.states:vr',
                  value=coast.interpolate(ys=[0.3285, 0], nodes='state_input'))
        p.set_val('coast.states:vt',
                  value=coast.interpolate(ys=[0.97, 1], nodes='state_input'))
        p.set_val('coast.states:accel',
                  value=coast.interpolate(ys=[0, 0], nodes='state_input'))
        p.set_val('coast.controls:u1',
                  value=coast.interpolate(ys=[0, 0], nodes='control_input'))

        p.set_val('burn2.t_initial', value=5.25)
        p.set_val('burn2.t_duration', value=1.75)

        p.set_val('burn2.states:r',
                  value=burn2.interpolate(ys=[1, 3], nodes='state_input'))
        p.set_val('burn2.states:theta',
                  value=burn2.interpolate(ys=[0, 4.0], nodes='state_input'))
        p.set_val('burn2.states:vr',
                  value=burn2.interpolate(ys=[0, 0], nodes='state_input'))
        p.set_val('burn2.states:vt',
                  value=burn2.interpolate(ys=[1, np.sqrt(1 / 3)],
                                          nodes='state_input'))
        p.set_val('burn2.states:accel',
                  value=burn2.interpolate(ys=[0.1, 0], nodes='state_input'))
        p.set_val('burn2.states:deltav',
                  value=burn2.interpolate(ys=[0.1, 0.2], nodes='state_input'))
        p.set_val('burn2.controls:u1',
                  value=burn2.interpolate(ys=[1, 1], nodes='control_input'))

        p.run_driver()

        assert_rel_error(self,
                         traj.get_values('deltav', flat=True)[-1],
                         0.3995,
                         tolerance=2.0E-3)

        # Plot results
        exp_out = traj.simulate(times=50, num_procs=3)

        fig = plt.figure(figsize=(8, 4))
        fig.suptitle('Two Burn Orbit Raise Solution')
        ax_u1 = plt.subplot2grid((2, 2), (0, 0))
        ax_deltav = plt.subplot2grid((2, 2), (1, 0))
        ax_xy = plt.subplot2grid((2, 2), (0, 1), rowspan=2)

        span = np.linspace(0, 2 * np.pi, 100)
        ax_xy.plot(np.cos(span), np.sin(span), 'k--', lw=1)
        ax_xy.plot(3 * np.cos(span), 3 * np.sin(span), 'k--', lw=1)
        ax_xy.set_xlim(-4.5, 4.5)
        ax_xy.set_ylim(-4.5, 4.5)

        ax_xy.set_xlabel('x ($R_e$)')
        ax_xy.set_ylabel('y ($R_e$)')

        ax_u1.set_xlabel('time ($TU$)')
        ax_u1.set_ylabel('$u_1$ ($deg$)')
        ax_u1.grid(True)

        ax_deltav.set_xlabel('time ($TU$)')
        ax_deltav.set_ylabel('${\Delta}v$ ($DU/TU$)')
        ax_deltav.grid(True)

        t_sol = traj.get_values('time')
        x_sol = traj.get_values('pos_x')
        y_sol = traj.get_values('pos_y')
        dv_sol = traj.get_values('deltav')
        u1_sol = traj.get_values('u1', units='deg')

        t_exp = exp_out.get_values('time')
        x_exp = exp_out.get_values('pos_x')
        y_exp = exp_out.get_values('pos_y')
        dv_exp = exp_out.get_values('deltav')
        u1_exp = exp_out.get_values('u1', units='deg')

        for phase_name in ['burn1', 'coast', 'burn2']:
            ax_u1.plot(t_sol[phase_name], u1_sol[phase_name], 'ro', ms=3)
            ax_u1.plot(t_exp[phase_name], u1_exp[phase_name], 'b-')

            ax_deltav.plot(t_sol[phase_name], dv_sol[phase_name], 'ro', ms=3)
            ax_deltav.plot(t_exp[phase_name], dv_exp[phase_name], 'b-')

            ax_xy.plot(x_sol[phase_name],
                       y_sol[phase_name],
                       'ro',
                       ms=3,
                       label='implicit' if phase_name == 'burn1' else None)
            ax_xy.plot(x_exp[phase_name],
                       y_exp[phase_name],
                       'b-',
                       label='explicit' if phase_name == 'burn1' else None)

        plt.show()
        top.driver.add_constraint('delta_omega_l_' + str(i + 1),
                                  lower=0.,
                                  scaler=1 / np.sqrt(eigval_ref[i]))

    for i in range(tn):
        top.driver.add_constraint('t_l_' + str(i + 1),
                                  lower=0.,
                                  scaler=1 / t_0[i])

    for i in range(mn):
        top.driver.add_constraint('m_l_' + str(i + 1),
                                  lower=0.,
                                  scaler=1 / m_0[i])

    #Optimization Recorder
    recorder = SqliteRecorder('modal_optim_COBYLA_scale1to9_case')
    recorder.options['record_params'] = True
    recorder.options['record_metadata'] = True
    top.driver.add_recorder(recorder)

    top.setup()
    view_model(top, show_browser=False)

    #Setting initial values for design variables
    top['t'] = t_0
    top['m'] = m_0
    #    top['t'] = np.array([50.,11.,10.,10.,10.,10.])
    #    top['m'] = np.array([0.5,0.2,0.2])

    top.run()
Example #31
0
    top.root = SellarDerivatives()

    # top.driver = ScipyOptimizer()
    # top.driver.options['optimizer'] = 'SLSQP'
    # top.driver.options['tol'] = 1.0e-8

    top.driver = pyOptSparseDriver()
    top.driver.options['optimizer'] = 'SNOPT'


    top.driver.add_desvar('z', lower=np.array([-10.0, 0.0]),
                         upper=np.array([10.0, 10.0]))
    top.driver.add_desvar('x', lower=0.0, upper=10.0)

    top.driver.add_objective('obj')
    top.driver.add_constraint('con1', upper=0.0)
    top.driver.add_constraint('con2', upper=0.0)
    rec = SqliteRecorder('sellar_snopt.db')
    top.driver.add_recorder(rec)
    rec.options['record_derivs'] = True

    top.setup()
    top.run()

    print("\n")
    print( "Minimum found at (%f, %f, %f)" % (top['z'][0],
                                             top['z'][1],
                                             top['x']))
    print("Coupling vars: %f, %f" % (top['y1'], top['y2']))
    print("Minimum objective: ", top['obj'])
def two_burn_orbit_raise_problem(transcription='gauss-lobatto',
                                 optimizer='SLSQP',
                                 r_target=3.0,
                                 transcription_order=3,
                                 compressed=False,
                                 show_output=True,
                                 connected=False):

    p = Problem(model=Group())

    p.driver = pyOptSparseDriver()
    p.driver.options['optimizer'] = optimizer
    if optimizer == 'SNOPT':
        p.driver.options['dynamic_simul_derivs'] = True
        p.driver.opt_settings['Major iterations limit'] = 100
        p.driver.opt_settings['Major feasibility tolerance'] = 1.0E-6
        p.driver.opt_settings['Major optimality tolerance'] = 1.0E-6
        if show_output:
            p.driver.opt_settings['iSumm'] = 6
    else:
        p.driver.options['dynamic_simul_derivs'] = True

    traj = make_traj(transcription=transcription,
                     transcription_order=transcription_order,
                     compressed=compressed,
                     connected=connected)
    p.model.add_subsystem('traj', subsys=traj)

    # Finish Problem Setup

    # Needed to move the direct solver down into the phases for use with MPI.
    #  - After moving down, used fewer iterations (about 30 less)

    p.driver.add_recorder(SqliteRecorder('two_burn_orbit_raise_example.db'))

    p.setup(check=True)

    # Set Initial Guesses
    p.set_val('traj.design_parameters:c', value=1.5, units='DU/TU')

    burn1 = p.model.traj.phases.burn1
    burn2 = p.model.traj.phases.burn2
    coast = p.model.traj.phases.coast

    if burn1 in p.model.traj.phases._subsystems_myproc:
        p.set_val('traj.burn1.t_initial', value=0.0)
        p.set_val('traj.burn1.t_duration', value=2.25)
        p.set_val('traj.burn1.states:r',
                  value=burn1.interpolate(ys=[1, 1.5], nodes='state_input'))
        p.set_val('traj.burn1.states:theta',
                  value=burn1.interpolate(ys=[0, 1.7], nodes='state_input'))
        p.set_val('traj.burn1.states:vr',
                  value=burn1.interpolate(ys=[0, 0], nodes='state_input'))
        p.set_val('traj.burn1.states:vt',
                  value=burn1.interpolate(ys=[1, 1], nodes='state_input'))
        p.set_val('traj.burn1.states:accel',
                  value=burn1.interpolate(ys=[0.1, 0], nodes='state_input'))
        p.set_val('traj.burn1.states:deltav',
                  value=burn1.interpolate(ys=[0, 0.1], nodes='state_input'))
        p.set_val('traj.burn1.controls:u1',
                  value=burn1.interpolate(ys=[-3.5, 13.0],
                                          nodes='control_input'))

    if coast in p.model.traj.phases._subsystems_myproc:
        p.set_val('traj.coast.t_initial', value=2.25)
        p.set_val('traj.coast.t_duration', value=3.0)

        p.set_val('traj.coast.states:r',
                  value=coast.interpolate(ys=[1.3, 1.5], nodes='state_input'))
        p.set_val('traj.coast.states:theta',
                  value=coast.interpolate(ys=[2.1767, 1.7],
                                          nodes='state_input'))

        p.set_val('traj.coast.states:vr',
                  value=coast.interpolate(ys=[0.3285, 0], nodes='state_input'))
        p.set_val('traj.coast.states:vt',
                  value=coast.interpolate(ys=[0.97, 1], nodes='state_input'))
        p.set_val('traj.coast.states:accel',
                  value=coast.interpolate(ys=[0, 0], nodes='state_input'))

    if burn2 in p.model.traj.phases._subsystems_myproc:
        if connected:
            p.set_val('traj.burn2.t_initial', value=7.0)
            p.set_val('traj.burn2.t_duration', value=-1.75)

            p.set_val('traj.burn2.states:r',
                      value=burn2.interpolate(ys=[r_target, 1],
                                              nodes='state_input'))
            p.set_val('traj.burn2.states:theta',
                      value=burn2.interpolate(ys=[4.0, 0.0],
                                              nodes='state_input'))
            p.set_val('traj.burn2.states:vr',
                      value=burn2.interpolate(ys=[0, 0], nodes='state_input'))
            p.set_val('traj.burn2.states:vt',
                      value=burn2.interpolate(ys=[np.sqrt(1 / r_target), 1],
                                              nodes='state_input'))
            p.set_val('traj.burn2.states:deltav',
                      value=burn2.interpolate(ys=[0.2, 0.1],
                                              nodes='state_input'))
            p.set_val('traj.burn2.states:accel',
                      value=burn2.interpolate(ys=[0., 0.1],
                                              nodes='state_input'))

        else:
            p.set_val('traj.burn2.t_initial', value=5.25)
            p.set_val('traj.burn2.t_duration', value=1.75)

            p.set_val('traj.burn2.states:r',
                      value=burn2.interpolate(ys=[1, r_target],
                                              nodes='state_input'))
            p.set_val('traj.burn2.states:theta',
                      value=burn2.interpolate(ys=[0, 4.0],
                                              nodes='state_input'))
            p.set_val('traj.burn2.states:vr',
                      value=burn2.interpolate(ys=[0, 0], nodes='state_input'))
            p.set_val('traj.burn2.states:vt',
                      value=burn2.interpolate(ys=[1, np.sqrt(1 / r_target)],
                                              nodes='state_input'))
            p.set_val('traj.burn2.states:deltav',
                      value=burn2.interpolate(ys=[0.1, 0.2],
                                              nodes='state_input'))
            p.set_val('traj.burn2.states:accel',
                      value=burn2.interpolate(ys=[0.1, 0],
                                              nodes='state_input'))

        p.set_val('traj.burn2.controls:u1',
                  value=burn2.interpolate(ys=[0, 0], nodes='control_input'))

    p.run_driver()

    return p
Example #33
0
root.connect('p1.x','my_comp.x' )
root.connect('p2.y', 'my_comp.y')
root.connect('my_comp.x', 'con.x')
root.connect('my_comp.y', 'con.y')

top.driver = ScipyOptimizer()
top.driver.options['optimizer'] = 'SLSQP'
 
top.driver.add_desvar('p1.x',lower = -50,upper = 50)
	
top.driver.add_desvar('p2.y', lower = -50, upper =50)
top.driver.add_objective('my_comp.f_xy')
top.driver.add_constraint('con.c', lower = 15.0, upper = 16)

recorder = SqliteRecorder('Parabola')
recorder.options['record_params'] = True
recorder.options['record_metadata'] = True
top.driver.add_recorder(recorder)


top.setup()
top.run()
top.cleanup()
print('\n')
print'Minimum of %s found at (%s,%s)' %(top['my_comp.f_xy'],top['my_comp.x'],top['my_comp.y'])




	
Example #34
0
    def test(self):
        import numpy as np

        from openmdao.api import IndepVarComp, Problem, Group, NewtonSolver, \
            ScipyIterativeSolver, LinearBlockGS, NonlinearBlockGS, \
            DirectSolver, LinearBlockGS, PetscKSP, SqliteRecorder

        from openaerostruct.geometry.utils import generate_mesh
        from openaerostruct.geometry.geometry_group import Geometry
        from openaerostruct.aerodynamics.aero_groups import AeroPoint

        # Create a dictionary to store options about the mesh
        mesh_dict = {
            'num_y': 7,
            'num_x': 2,
            'wing_type': 'CRM',
            'symmetry': True,
            'num_twist_cp': 5
        }

        # Generate the aerodynamic mesh based on the previous dictionary
        mesh, twist_cp = generate_mesh(mesh_dict)

        # Create a dictionary with info and options about the aerodynamic
        # lifting surface
        surface = {
            # Wing definition
            'name': 'wing',  # name of the surface
            'type': 'aero',
            'symmetry': True,  # if true, model one half of wing
            # reflected across the plane y = 0
            'S_ref_type': 'wetted',  # how we compute the wing area,
            # can be 'wetted' or 'projected'
            'fem_model_type': 'tube',
            'twist_cp': twist_cp,
            'mesh': mesh,
            'num_x': mesh.shape[0],
            'num_y': mesh.shape[1],

            # Aerodynamic performance of the lifting surface at
            # an angle of attack of 0 (alpha=0).
            # These CL0 and CD0 values are added to the CL and CD
            # obtained from aerodynamic analysis of the surface to get
            # the total CL and CD.
            # These CL0 and CD0 values do not vary wrt alpha.
            'CL0': 0.0,  # CL of the surface at alpha=0
            'CD0': 0.015,  # CD of the surface at alpha=0

            # Airfoil properties for viscous drag calculation
            'k_lam': 0.05,  # percentage of chord with laminar
            # flow, used for viscous drag
            't_over_c': 0.15,  # thickness over chord ratio (NACA0015)
            'c_max_t': .303,  # chordwise location of maximum (NACA0015)
            # thickness
            'with_viscous': True,  # if true, compute viscous drag
        }

        # Create the OpenMDAO problem
        prob = Problem()

        # Create an independent variable component that will supply the flow
        # conditions to the problem.
        indep_var_comp = IndepVarComp()
        indep_var_comp.add_output('v', val=248.136, units='m/s')
        indep_var_comp.add_output('alpha', val=5., units='deg')
        indep_var_comp.add_output('M', val=0.84)
        indep_var_comp.add_output('re', val=1.e6, units='1/m')
        indep_var_comp.add_output('rho', val=0.38, units='kg/m**3')
        indep_var_comp.add_output('cg', val=np.zeros((3)), units='m')

        # Add this IndepVarComp to the problem model
        prob.model.add_subsystem('prob_vars', indep_var_comp, promotes=['*'])

        # Create and add a group that handles the geometry for the
        # aerodynamic lifting surface
        geom_group = Geometry(surface=surface)
        prob.model.add_subsystem(surface['name'], geom_group)

        # Create the aero point group, which contains the actual aerodynamic
        # analyses
        aero_group = AeroPoint(surfaces=[surface])
        point_name = 'aero_point_0'
        prob.model.add_subsystem(
            point_name,
            aero_group,
            promotes_inputs=['v', 'alpha', 'M', 're', 'rho', 'cg'])

        name = surface['name']

        # Connect the mesh from the geometry component to the analysis point
        prob.model.connect(name + '.mesh',
                           point_name + '.' + name + '.def_mesh')

        # Perform the connections with the modified names within the
        # 'aero_states' group.
        prob.model.connect(name + '.mesh',
                           point_name + '.aero_states.' + name + '_def_mesh')

        # Import the Scipy Optimizer and set the driver of the problem to use
        # it, which defaults to an SLSQP optimization method
        from openmdao.api import ScipyOptimizeDriver
        prob.driver = ScipyOptimizeDriver()
        prob.driver.options['tol'] = 1e-9

        recorder = SqliteRecorder("aero.db")
        prob.driver.add_recorder(recorder)
        prob.driver.recording_options['record_derivatives'] = True

        # Setup problem and add design variables, constraint, and objective
        prob.model.add_design_var('wing.twist_cp', lower=-10., upper=15.)
        prob.model.add_constraint(point_name + '.wing_perf.CL', equals=0.5)
        prob.model.add_objective(point_name + '.wing_perf.CD', scaler=1e4)

        # Set up and run the optimization problem
        prob.setup()
        prob.run_model()
        # prob.check_partials(compact_print=True)
        # exit()
        prob.run_driver()

        assert_rel_error(self, prob['aero_point_0.wing_perf.CD'][0],
                         0.033389699871650073, 1e-6)
        assert_rel_error(self, prob['aero_point_0.wing_perf.CL'][0], 0.5, 1e-6)
        assert_rel_error(self, prob['aero_point_0.CM'][1],
                         -0.18451822790794759, 1e-6)