コード例 #1
0
def create_sol():

    desvar = DesignVariables()

    struct_lift_model = Surfpack('STRUCT_LIFT', desvar.ndim - 2)
    struct_lift_model.load_model('struct_lift.sps')
    struct_drag_model = Surfpack('STRUCT_DRAG', desvar.ndim - 2)
    struct_drag_model.load_model('struct_drag.sps')

    lift_model = Surfpack('LIFT', desvar.ndim)
    lift_model.load_model('../FLIGHT_MECHANICS/model_lift_sup.sps')
    drag_model = Surfpack('DRAG', desvar.ndim)
    drag_model.load_model('../FLIGHT_MECHANICS/model_drag_sup.sps')

    mach_vec = [1.2, 1.5, 1.7, 2.0, 3.0, 5.0, 7.0]
    aoa_range = [[0.0, 15.0], [0.0, 17.0], [2.5, 19.0], [2.5, 20.0],
                 [5.0, 25.0], [7.5, 35.0], [15.0, 40.0]]

    nx = 100

    fig_1 = plt.figure(1)
    fig_2 = plt.figure(2)

    for mach_index in range(len(mach_vec)):

        mach = mach_vec[mach_index]

        aoa_vec = numpy.linspace(aoa_range[mach_index][0],
                                 aoa_range[mach_index][1], nx)

        lift_vec = numpy.zeros(len(aoa_vec))
        drag_vec = numpy.zeros(len(aoa_vec))

        struct_lift_vec = numpy.zeros(len(aoa_vec))
        struct_drag_vec = numpy.zeros(len(aoa_vec))

        for aoa_index in range(len(aoa_vec)):

            dvs = desvar.reverse_variable_change([
                mach, 1E7, aoa_vec[aoa_index], 0.0, 0.0, -0.5, 0.5, 0.0, 0.0,
                0.0, 0.0
            ])
            dvs[desvar.
                rey_index] = 0.0  # Force Reynolds to Reference Trajectory

            dvs_filtered = dvs[0:3] + dvs[5:11]

            lift_vec[aoa_index] = lift_model.eval(dvs)
            drag_vec[aoa_index] = drag_model.eval(dvs)

            struct_lift_vec[aoa_index] = struct_lift_model.eval(dvs_filtered)
            struct_drag_vec[aoa_index] = struct_drag_model.eval(dvs_filtered)

        plt.figure(1)
        plt.plot(aoa_vec, lift_vec, 'b')
        plt.plot(aoa_vec, struct_lift_vec, 'r')

        plt.figure(2)
        plt.plot(aoa_vec, drag_vec, 'b')
        plt.plot(aoa_vec, struct_drag_vec, 'r')

    plt.figure(1)
    plt.title('Lift Coefficient', fontsize=18)
    plt.xlabel('AoA [Deg]', fontsize=18)
    plt.legend(mach_vec, title='Mach')

    plt.figure(2)
    plt.title('Drag Coefficient', fontsize=18)
    plt.xlabel('AoA [Deg]', fontsize=18)
    plt.legend(mach_vec, title='Mach')

    fig_1.savefig('fig_lift.png')
    fig_2.savefig('fig_drag.png')

    plt.close(fig_1)
    plt.close(fig_2)
コード例 #2
0
def response_surface( filename          ,
                      project_folder    ,
                      initiate = True  ,
                      partitions  = 0  ):

    # Project

    if os.path.exists(project_folder):
        project = SPACE.io.load_data(os.path.join(project_folder,'project.pkl'))
        project.compile_designs()
        config = project.config
    else:
        config = SPACE.io.Config(filename)
        state  = SPACE.io.State()
        project = SPACE.project.Project(config, state, folder=project_folder)


    # Start new model

    konfig = copy.deepcopy(config)

    aero = spacemodel.AeroModel(konfig,project_folder)

    # Design Variables

    XB = np.array([
        [0.3,  8.0],       # dv_mach
        [-1.0, 1.0],       # dv_rey
        [-1.0, 1.0],       # dv_aoa            # CHEAT UPPER BOUND AOA

        [-0.5, 0.5],       # dv_geo1
        [-0.5, 0.5],       # dv_geo2
        [-0.5, 0.5],       # dv_geo3
        [-0.2, 0.5],       # dv_geo4
    ])


    ndim = 7

    flag = 'K_ALPHA_FWD'

    if initiate:

        nd = 400 #10*ndim

        X = LHC_unif(XB,nd)

        model = Surfpack(flag,ndim)

        for index in range(len(X)):

            print X[index]

            perfo_dvs = X[index]
            aero_dvs = perfo_to_aero(perfo_dvs)
            val = eval_function(flag,aero,aero_dvs)
            if abs(val) < max_admissible(flag):
                model.add(perfo_dvs,val)

        model.save_data(os.path.join(project_folder,'build_points_' + flag + '.dat'))

    else:

        na = 500

        model = Surfpack(flag,ndim)
        model.load_data(os.path.join(project_folder,'build_points_' + flag + '.dat'))
        model.build('kriging')
        model.save_model(os.path.join(project_folder,'model_' + flag + '.sps'))

        for ite in range(na):

            print 'Ite:', ite
            model.build('kriging')
            print 'Model built'

            perfo_dvs = model.max_variance(XB)
            print 'dvs: ', perfo_dvs
            aero_dvs = perfo_to_aero(perfo_dvs)
            val = eval_function(flag,aero,aero_dvs)

            if abs(val) < max_admissible(flag):
                model.add(perfo_dvs,val)
                model.save_data(os.path.join(project_folder,'enriched_points_' + flag + '.dat'))

        # Save Model

        model.build('kriging')
        model.save_model(os.path.join(project_folder,'model_' + flag + '.sps'))
コード例 #3
0
def eval_design(func_name, config):
    """ interface for async jobs
    """

    design_filename = 'design.pkl'
    if os.path.exists(design_filename):
        design = spaceio.load_data(design_filename)
        design.config = config
        save_data(design.filename,design)
    else:
        design = init_design(config)
        save_data(design.filename,design)

    # ##################
    # config = SPACE.io.Config('config_DSN.cfg')
    # design.config = config
    # ##################







    load_models = False

    if load_models:

        desvar = DesignVariables()

        n_models = 2180

        models_folder = '../../../RESPONSE_SURFACE_DV_SUP/DESIGNS/MODELS'

        for index in range(n_models):
            cp_model = Surfpack('CP_%05d' % (index+1), desvar.ndim)
            cp_model.load_model(os.path.join(models_folder,'model_cp_%05d.sps' % (index+1)))

        for index in range(n_models):
            cfx_model = Surfpack('CFX_%05d' % (index+1), desvar.ndim)
            cfx_model.load_model(os.path.join(models_folder,'model_cfx_%05d.sps' % (index+1)))

        for index in range(n_models):
            cfy_model = Surfpack('CFY_%05d' % (index+1), desvar.ndim)
            cfy_model.load_model(os.path.join(models_folder,'model_cfy_%05d.sps' % (index+1)))

        for index in range(n_models):
            cfz_model = Surfpack('CFZ_%05d' % (index+1), desvar.ndim)
            cfz_model.load_model(os.path.join(models_folder,'model_cfz_%05d.sps' % (index+1)))




    if func_name == 'AERODYNAMICS':
#        design.func('GEOMETRY')   # this way, will save intermadiate design
#        design.func('FLUID_MESH') # this way, will save intermadiate design
        design.func(func_name)
    else:
        design.func(func_name)
コード例 #4
0
def create_sol(regime='BOTH'):

    n_models = 132
    models_folder = 'MODELS'
    build_points_folder = 'BUILD_POINTS'

    desvar = DesignVariables()

    if regime == 'ON':

        ndim_struct = desvar.ndim_struct_on
        pack_structure = desvar.pack_structure_on

        dry_mass_index = 3
        fuel_mass_index = 4
        thrust_index = 5
        pdyn_index = 6

        dv1_index = 7
        dv2_index = 8
        dv3_index = 9
        dv4_index = 10
        dv5_index = 11
        dv6_index = 12

    elif regime == 'OFF':

        ndim_struct = desvar.ndim_struct_off
        pack_structure = desvar.pack_structure_off

        dry_mass_index = 3
        pdyn_index = 4

        dv1_index = 5
        dv2_index = 8
        dv3_index = 7
        dv4_index = 8
        dv5_index = 9
        dv6_index = 10

    elif regime == 'BOTH':

        ndim_struct = desvar.ndim_struct
        pack_structure = desvar.pack_structure

        thrust_index = 5
        pdyn_index = 6

        dv1_index = 8
        dv2_index = 9
        dv3_index = 10
        dv4_index = 11
        dv5_index = 12
        dv6_index = 13

    mass_models = []
    for index in range(n_models):
        mass_model = Surfpack('MASS_%05d' % (index + 1), ndim_struct)
        mass_model.load_model(
            os.path.join(models_folder, 'model_mass_%05d.sps' % (index + 1)))
        mass_models.append(mass_model)

    mass_models[29 - 1] = 1.480621e+00
    mass_models[87 - 1] = 1.419052e+00
    mass_models[88 - 1] = 1.542190e+00
    mass_models[119 - 1] = 4.657316e+00
    mass_models[122 - 1] = 6.165402e+00

    # area_models = []
    # for index in range(n_models):
    #     area_model = Surfpack('AREA_%05d' % (index+1), ndim_struct)
    #     area_model.load_model(os.path.join(models_folder,'model_area_%05d.sps' % (index+1)))
    #     area_models.append(area_model)

    # area_models[29-1] = 3.328734e-01
    # area_models[87-1] = 3.190315e-01
    # area_models[88-1] = 3.467154e-01
    # area_models[119-1] = 1.047058e+00
    # area_models[122-1] = 1.386107e+00

    # thickness_models = []
    # for index in range(n_models):
    #     thickness_model = Surfpack('THICKNESS_%05d' % (index+1), ndim_struct)
    #     thickness_model.load_model(os.path.join(models_folder,'model_thickness_%05d.sps' % (index+1)))
    #     thickness_models.append(thickness_model)

    # thickness_models[29-1] = 1.600000e-03
    # thickness_models[87-1] = 1.600000e-03
    # thickness_models[88-1] = 1.600000e-03
    # thickness_models[119-1] = 1.600000e-03
    # thickness_models[122-1] = 1.600000e-03

    # thickness_models = []
    # thickness_clfs = []
    # thickness_values = []
    # for index in range(n_models):

    #     dat_file = os.path.join(build_points_folder,'enriched_points_thickness_%05d.dat' % (index+1))
    #     clf, values, X_train, y_train = get_clf(dat_file)
    #     thickness_clfs.append(clf)
    #     thickness_values.append(values)

    #     count = 0
    #     thicknesses = []
    #     for dvs in X_train:
    #         proba = clf.predict_proba([dvs])[0]
    #         thickness = values[numpy.argmax(proba)]
    #         if not thickness: count += 1
    #         thicknesses.append(thickness)

    #     print index+1, count

    #     if count > 10:
    #         def pareto_function(x):
    #             F = [abs(clf.predict_proba([x])[0][0]-0.5)]  # NEED TO SOLVE FOR BOTH BOUNDARIES, ONLY LOWER BOUNDARY SO FAR
    #             G = []
    #             if len(F)==1: F=F[0]
    #             fail = 0
    #             return F,G,fail

    #         prob = pyOpt.Optimization('Variance Maximization',pareto_function)

    #         XB = desvar.XB_STRUCT
    #         for ix in range(XB.shape[0]):
    #             prob.addVar('X%i'%ix,'c',lower=XB[ix,0],upper=XB[ix,1],value=0.5*(XB[ix,0]+XB[ix,1]))

    #         prob.addObj('Estimated Variance')

    #         opt_ALPSO = pyOpt.ALPSO(pll_type=None)
    #         opt_ALPSO.setOption('fileout',0)
    #         opt_ALPSO.setOption('maxOuterIter',10)
    #         opt_ALPSO.setOption('stopCriteria',1)
    #         opt_ALPSO.setOption('SwarmSize',ndim_struct*20)

    #         [YI_min,X_min,Info] = opt_ALPSO(prob)

    #         print X_min.tolist()
    #         print clf.predict_proba([X_min.tolist()])[0]

    #     print '---------------------'

    #     # filename = os.path.join(models_folder,'model_thickness_filtered_%05d.sps' % (index+1))
    #     # if os.path.exists(filename):
    #     #     thickness_model = Surfpack('THICKNESS_%05d' % (index+1), ndim_struct)
    #     #     thickness_model.load_model(filename)
    #     #     thickness_models.append(thickness_model)
    #     # else:
    #     #     thickness_models.append(None)

    # sys.exit()

    structure_mass_model = Surfpack('STRUCTURE_MASS', ndim_struct)
    structure_mass_model.load_model(
        os.path.join(models_folder, 'model_structure_mass.sps'))

    structure_area_model = Surfpack('STRUCTURE_AREA', ndim_struct)
    structure_area_model.load_model(
        os.path.join(models_folder, 'model_structure_area.sps'))

    # structure_mass_model_538 = Surfpack('STRUCTURE_MASS_538', ndim_struct)
    # structure_mass_model_538.load_model(os.path.join(models_folder,'model_structure_mass_538.sps'))

    # if regime == 'ON':
    #     print '///////////////////////////////////'
    #     dvs = [8,  -8.154462e-01 , -3.769461e-01,   2.105852e+04 ,  2.353362e+04  , 1.514796e+06 ,  2.065276e+04  , 1.156752e-01 , -1.911024e-01,  -4.267155e-01,  -1.732892e-01 , -3.821894e-01 ,  6.623392e-02]
    #     dvs = [6.681148e+00 ,  3.875544e-02 , -4.776890e-01 ,  5.181418e+03  , 1.119053e+04 ,  1.802179e+05 ,  6.625015e+03 ,  4.811014e-01 , -1.691460e-01 , -1.736698e-01 ,  2.441538e-01 , -3.857268e-01 ,  7.727754e-03]
    #     print structure_mass_model.eval(dvs)
    #     half_structure_mass_compounded = 0
    #     for index in range(n_models):
    #         area = area_models[index].eval(dvs)
    #         thickness = thickness_models[index].eval(dvs)
    #         if thickness < 0.0016: thickness = 0.0016
    #         half_structure_mass_compounded += area*thickness*2780.0
    #     print half_structure_mass_compounded
    #     dvs = [3 ,  1.000000e+00,  -4.428224e-01 ,  3.000000e+04  , 0.000000e+00  , 1.000000e+05 ,  1.000000e-06 , -5.000000e-01,  -5.000000e-01 , -5.000000e-01 , -2.000000e-01 , -5.000000e-01 , -2.000000e-01]
    #     print structure_mass_model.eval(dvs)
    #     half_structure_mass_compounded = 0
    #     for index in range(n_models):
    #         half_structure_mass_compounded += mass_models[index].eval(dvs)
    #     print half_structure_mass_compounded
    #     dvs = [8 ,  4.778873e-01   ,7.637604e-01 ,  6.573100e+03 ,  1.946402e+03  , 2.520920e+06 ,  2.220040e+04 , -3.427057e-01 ,  9.163581e-02 , -1.100301e-01  , 3.888815e-01 ,  4.278542e-01 ,  3.149009e-01]
    #     print structure_mass_model.eval(dvs)
    #     half_structure_mass_compounded = 0
    #     for index in range(n_models):
    #         half_structure_mass_compounded += mass_models[index].eval(dvs)
    #     print half_structure_mass_compounded
    #     print '///////////////////////////////////'

    #    for val in numpy.linspace(-0.5,0.5,10.0):
    #        dvs[dv2_index] = val
    #        mass = 0
    #        for index in range(n_models):
    #            mass += mass_models[index].eval(dvs)
    #        print mass
    #        print mass_models[49].eval(dvs)

    if regime == 'ON':
        #dvs = [1.1,0.0,1.0,20.0e3,20.0e3,2.5e6,20.0e3,0.0,0.0,0.0,0.0,0.0,0.0]
        dvs_baseline = [
            1.1, 0.0, 1.0, 20.0e3, 20.0e3, 2.5e6, 20.0e3, 0.0, 0.0, 0.0, 0.0,
            0.0, 0.0
        ]
        #dvs_baseline = [6.681148e+00 ,  3.875544e-02 , -4.776890e-01 ,  5.181418e+03  , 1.119053e+04 ,  1.802179e+05 ,  6.625015e+03 ,  4.811014e-01 , -1.691460e-01 , -1.736698e-01 ,  2.441538e-01 , -3.857268e-01 ,  7.727754e-03]
    elif regime == 'OFF':
        #dvs = [3.5,0.0,0.0,20.0e3,20.0e3,0.0,0.0,0.0,0.0,0.0,0.0]
        dvs_baseline = [
            1.1, 0.0, 1.0, 20.0e3, 20.0e3, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0
        ]
    elif regime == 'BOTH':
        #dvs = [3.5,0.0,0.0,20.0e3,20.0e3,0.0,0.0,0.0,0.0,0.0,0.0]
        dvs_baseline = [
            1.1, 0.0, 1.0, 3.0, -3.0, 1.5e6, 20.0e3, 20.0e3, 0.0, 0.0, 0.0,
            0.0, 0.0, 0.0
        ]

        # Midpoint
        dvs_baseline = [
            4.5, 0.0, 0.0, 3.0, -3.0, 1.5e6, 20.0e3, 14.0e3, 0.0, 0.0, 0.0,
            0.0, 0.0, 0.0
        ]

    print 'FIG 1'

    data_vals = numpy.linspace(0.1e6, 3.0e6, 10.0)
    data_thrust = [
        4649.719614, 4687.683943, 4821.850514, 4973.544549, 5123.671123,
        5284.42803, 5458.613164, 5680.410132, 5954.866974, 6221.018232
    ]

    fig = plt.figure()
    vals = numpy.linspace(0.1e6, 3.0e6, 10.0)
    for dv_index in [thrust_index]:
        half_structure_masses = []
        half_structure_masses_compounded = []
        for val in vals:
            dvs = copy.copy(dvs_baseline)
            dvs[dv_index] = val
            #dvs[dry_mass_index] = 20.e3
            half_structure_mass = structure_mass_model.eval(dvs)
            #effective_half_dry_mass = compute_effective_half_dry_mass(half_structure_mass, dvs, regime)
            # for index in range(10):
            #     dvs[dry_mass_index] = 2.0*effective_half_dry_mass
            #     half_structure_mass = structure_mass_model.eval(dvs)
            #     effective_half_dry_mass = compute_effective_half_dry_mass(half_structure_mass, dvs, regime)
            half_structure_masses.append(half_structure_mass)

            #dvs[dry_mass_index] = 20.e3

            # half_structure_mass_compounded = 0
            # for index in range(n_models):
            #     area = area_models[index].eval(dvs)
            #     thickness = thickness_models[index].eval(dvs)
            #     if thickness < 0.0016: thickness = 0.0016
            #     half_structure_mass_compounded += area*thickness*2780.0

            #effective_half_dry_mass = compute_effective_half_dry_mass(half_structure_mass_compounded, dvs, regime)
            # for index in range(10):
            #     dvs[dry_mass_index] = 2.0*effective_half_dry_mass
            #     half_structure_mass_compounded = 0
            #     for index in range(n_models):
            #         half_structure_mass_compounded += mass_models[index].eval(dvs)
            #     effective_half_dry_mass = compute_effective_half_dry_mass(half_structure_mass_compounded, dvs, regime)
            # half_structure_masses_compounded.append(half_structure_mass_compounded)

            half_structure_mass_compounded = 0
            for index in range(n_models):
                if isinstance(mass_models[index], float):
                    mass = mass_models[index]
                else:
                    mass = mass_models[index].eval(dvs)
                print mass
                half_structure_mass_compounded += mass
            half_structure_masses_compounded.append(
                half_structure_mass_compounded)

        plt.plot(vals, half_structure_masses, linestyle='-',
                 color='b')  #, color='red')
        # plt.plot(vals, half_structure_masses_compounded, linestyle='-.', color='b') #, color='red')

    plt.plot(data_vals, data_thrust, linestyle='--', color='b')

    plt.legend(['thrust model', 'thrust model comp', 'thrust data'])
    fig.savefig('fig_1.png')
    plt.close(fig)

    print 'FIG 2'

    data_vals = numpy.linspace(1.0e-6, 35.0e3, 10.0)
    data_pdyn = [
        2957.71009, 2625.264827, 3001.195708, 3736.965894, 4429.157145,
        5088.273839, 5688.673517, 6294.21067, 6926.893072, 7560.110534
    ]

    fig = plt.figure()
    vals = numpy.linspace(0.0, 35.0e3, 10.0)
    for dv_index in [pdyn_index]:
        half_structure_masses = []
        half_structure_masses_compounded = []
        for val in vals:

            dvs = copy.copy(dvs_baseline)

            dvs[dv_index] = val

            #dvs[dry_mass_index] = 20.e3
            half_structure_mass = structure_mass_model.eval(dvs)
            #effective_half_dry_mass = compute_effective_half_dry_mass(half_structure_mass, dvs, regime)
            # for index in range(10):
            #     dvs[dry_mass_index] = 2.0*effective_half_dry_mass
            #     half_structure_mass = structure_mass_model.eval(dvs)
            #     effective_half_dry_mass = compute_effective_half_dry_mass(half_structure_mass, dvs, regime)
            half_structure_masses.append(half_structure_mass)

            #dvs[dry_mass_index] = 20.e3
            # half_structure_mass_compounded = 0
            # for index in range(n_models):
            #     area = area_models[index].eval(dvs)
            #     thickness = thickness_models[index].eval(dvs)
            #     if thickness < 0.0016: thickness = 0.0016
            #     half_structure_mass_compounded += area*thickness*2780.0
            #effective_half_dry_mass = compute_effective_half_dry_mass(half_structure_mass_compounded, dvs, regime)
            # for index in range(10):
            #     dvs[dry_mass_index] = 2.0*effective_half_dry_mass
            #     half_structure_mass_compounded = 0
            #     for index in range(n_models):
            #         half_structure_mass_compounded += mass_models[index].eval(dvs)
            #     effective_half_dry_mass = compute_effective_half_dry_mass(half_structure_mass_compounded, dvs, regime)
            # half_structure_masses_compounded.append(half_structure_mass_compounded)

            half_structure_mass_compounded = 0
            for index in range(n_models):
                if isinstance(mass_models[index], float):
                    mass = mass_models[index]
                else:
                    mass = mass_models[index].eval(dvs)
                print mass
                half_structure_mass_compounded += mass
            half_structure_masses_compounded.append(
                half_structure_mass_compounded)

        plt.plot(vals, half_structure_masses, linestyle='-',
                 color='b')  #, color='red')
        # plt.plot(vals, half_structure_masses_compounded, linestyle='-.', color='b') #, color='red')

    plt.plot(data_vals, data_pdyn, linestyle='--', color='b')

    plt.legend(['pdyn model', 'pdyn data'])
    fig.savefig('fig_2.png')
    plt.close(fig)

    print 'FIG 3'

    data_vals = numpy.linspace(-0.5, 0.5, 10.0)
    data_dv1 = [
        5590.589805, 5533.773873, 5380.979267, 5298.78498, 5217.45326,
        5137.956884, 5053.125224, 4968.984914, 4911.796718, 4867.404202
    ]
    data_dv2 = [
        4758.01053, 4856.109344, 4953.734989, 5037.584574, 5121.434159,
        5247.678988, 5378.20162, 5499.651994, 5611.571558, 5718.533598
    ]
    data_dv3 = [
        4505.383296, 4644.681223, 4782.928996, 4937.26097, 5097.557156,
        5257.873734, 5416.235764, 5573.284102, 5731.643236, 5885.3711
    ]

    fig = plt.figure()
    vals = numpy.linspace(-0.5, 0.5, 10.0)

    # eval_indexes = []
    # dvs = copy.copy(dvs_baseline)
    # for index in range(n_models):
    #     proba = thickness_clfs[index].predict_proba([dvs])
    #     thickness = thickness_values[index][numpy.argmin(proba)]
    #     if thickness == 0.0016: eval_indexes.append(index)

    # eval_indexes = range(132) #eval_indexes[0:3]

    # print len(eval_indexes)
    # print eval_indexes

    # dat_file = os.path.join(build_points_folder,'enriched_points_mass_00001.dat')
    # data = numpy.loadtxt(dat_file)
    # intermediate_masses = [0.0 for index in range(len(data))]
    # for index in eval_indexes:
    #     dat_file = os.path.join(build_points_folder,'enriched_points_mass_%05d.dat' % (index+1))
    #     data = numpy.loadtxt(dat_file)
    #     for index_data in range(len(intermediate_masses)):
    #         val = data[index_data][-1]
    #         intermediate_masses[index_data] += val

    # intermediate_mass_model = Surfpack('INTERMEDIATE_MASS', ndim_struct)
    # dat_file = os.path.join(build_points_folder,'enriched_points_mass_00001.dat')
    # data = numpy.loadtxt(dat_file)
    # for index_data in range(0,len(data)):
    #     dvs = data[index_data][0:-1]
    #     intermediate_mass_model.add(dvs, intermediate_masses[index_data])

    # print 'BUILDING'
    # intermediate_mass_model.build('kriging')

    # dat_file = os.path.join(build_points_folder,'enriched_points_mass_00001.dat')
    # data = numpy.loadtxt(dat_file)
    # dvs = data[0][0:-1]

    # eval_indexes = []
    # for index in range(n_models):
    #     proba = thickness_clfs[index].predict_proba([dvs])
    #     thickness = thickness_values[index][numpy.argmin(proba)]
    #     if thickness == 0.0016: eval_indexes.append(index)

    # print '/////////////////////////////////////////////'
    # print dvs

    # intermediate_masses = 0.0
    # for index in eval_indexes:
    #     dat_file = os.path.join(build_points_folder,'enriched_points_area_%05d.dat' % (index+1))
    #     data = numpy.loadtxt(dat_file)
    #     val = data[0][-1]
    #     intermediate_masses += val
    # print intermediate_masses

    # half_structure_mass_compounded = 0.0
    # for index in eval_indexes:
    #     area = area_models[index].eval(dvs)
    #     proba = thickness_clfs[index].predict_proba([dvs])
    #     thickness = thickness_values[index][numpy.argmin(proba)]
    #     half_structure_mass_compounded += area #*thickness*2780.0
    # print half_structure_mass_compounded
    # print '/////////////////////////////////////////////'

    colors = ['b', 'r', 'g']
    counter = 0

    for dv_index in [dv1_index, dv2_index, dv3_index]:
        print dv_index
        half_structure_masses = []
        half_intermediate_masses = []
        half_structure_masses_compounded = []
        for val in vals:

            dvs = copy.copy(dvs_baseline)

            dvs[dv_index] = val

            half_structure_mass = structure_mass_model.eval(dvs)
            half_structure_masses.append(half_structure_mass)

            # half_intermediate_mass = intermediate_mass_model.eval(dvs)
            # half_intermediate_masses.append(half_intermediate_mass)

            half_structure_mass_compounded = 0
            for index in range(n_models):

                if isinstance(mass_models[index], float):
                    mass = mass_models[index]
                else:
                    mass = mass_models[index].eval(dvs)
                half_structure_mass_compounded += mass

                # if isinstance(area_models[index], float):
                #     area = area_models[index]
                # else:
                #     area = area_models[index].eval(dvs)

                # if isinstance(thickness_models[index], float):
                #     thickness = thickness_models[index]
                # else:
                #     thickness = thickness_models[index].eval(dvs)

                # thickness = max(0.0016,min(0.1,thickness))

                # proba = thickness_clfs[index].predict_proba([dvs])
                # thickness = thickness_values[index][numpy.argmin(proba)]

                # half_structure_mass_compounded += area*thickness*2780.0

            half_structure_masses_compounded.append(
                half_structure_mass_compounded)

        plt.plot(vals, half_structure_masses,
                 color=colors[counter])  #, color='red')
        #        plt.plot(vals, half_structure_masses_compounded, linestyle='-.', color=colors[counter]) #, color='red')
        counter += 1

        #plt.plot(vals, half_intermediate_masses) #, color='red')
        #plt.plot(vals, half_structure_masses_compounded) #, color='red')

    # plt.plot(data_vals, data_dv1, linestyle='--', color='b')
    # plt.plot(data_vals, data_dv2, linestyle='--', color='r')
    # plt.plot(data_vals, data_dv3, linestyle='--', color='g')

    plt.legend([
        'dv1 model', 'dv2 model', 'dv3 model', 'dv1 data', 'dv2 data',
        'dv3 data'
    ])

    #effective_half_dry_mass = compute_effective_half_dry_mass(half_structure_mass_compounded, dvs, regime)
    # for index in range(10):
    #     dvs[dry_mass_index] = 2.0*effective_half_dry_mass
    #     half_structure_mass_compounded = 0
    #     for index in range(n_models):
    #         half_structure_mass_compounded += mass_models[index].eval(dvs)
    #     effective_half_dry_mass = compute_effective_half_dry_mass(half_structure_mass_compounded, dvs, regime)

    print 'Save'

    fig.savefig('fig_3.png')
    plt.close(fig)
コード例 #5
0
def process_design(regime='BOTH'):

    original = False

    number_ini = 0
    range_number = 840

    if original:
        build_points_folder = 'BUILD_POINTS_ORIGINAL'
        designs_folder = 'DESIGNS_BATCH_1'
    else:
        build_points_folder = 'BUILD_POINTS'
        designs_folder = 'DESIGNS'

    desvar = DesignVariables()

    if regime == 'ON':

        ndim_struct = desvar.ndim_struct_on
        pack_structure = desvar.pack_structure_on

    elif regime == 'OFF':

        ndim_struct = desvar.ndim_struct_off
        pack_structure = desvar.pack_structure_off

    elif regime == 'BOTH':

        ndim_struct = desvar.ndim_struct
        pack_structure = desvar.pack_structure

    threshold = 1.0001

    mass_models = []
    for index in range(132):
        mass_model = Surfpack('MASS_%05d' % (index + 1), ndim_struct)
        # if original:
        #     mass_model.load_data(os.path.join(build_points_folder,'build_points_mass_%05d.dat' % (index+1)))
        # else:
        #     mass_model.load_data(os.path.join('BUILD_POINTS_ORIGINAL','enriched_points_mass_%05d.dat' % (index+1)))
        mass_models.append(mass_model)

    thickness_models = []
    for index in range(132):
        thickness_model = Surfpack('THICKNESS_%05d' % (index + 1), ndim_struct)
        # if original:
        #     thickness_model.load_data(os.path.join(build_points_folder,'build_points_thickness_%05d.dat' % (index+1)))
        # else:
        #     thickness_model.load_data(os.path.join('BUILD_POINTS_ORIGINAL','enriched_points_thickness_%05d.dat' % (index+1)))
        thickness_models.append(thickness_model)

    area_models = []
    for index in range(132):
        area_model = Surfpack('AREA_%05d' % (index + 1), ndim_struct)
        # if original:
        #     area_model.load_data(os.path.join(build_points_folder,'build_points_area_%05d.dat' % (index+1)))
        # else:
        #     area_model.load_data(os.path.join('BUILD_POINTS_ORIGINAL','enriched_points_area_%05d.dat' % (index+1)))
        area_models.append(area_model)

    structure_mass_model = Surfpack('STRUCTURE_MASS', ndim_struct)
    structure_area_model = Surfpack('STRUCTURE_AREA', ndim_struct)
    # if original:
    #     structure_mass_model.load_data(os.path.join(build_points_folder,'build_points_STRUCTURE_MASS.dat'))
    #     structure_area_model.load_data(os.path.join(build_points_folder,'build_points_STRUCTURE_AREA.dat'))
    # else:
    #     structure_mass_model.load_data(os.path.join('BUILD_POINTS_ORIGINAL','enriched_points_STRUCTURE_MASS.dat'))
    #     structure_area_model.load_data(os.path.join('BUILD_POINTS_ORIGINAL','enriched_points_STRUCTURE_AREA.dat'))

    for dsn_index in range(number_ini, range_number):

        design_folder = os.path.join(designs_folder,
                                     'DSN_%03d' % (dsn_index + 1))
        history_file_name = os.path.join(design_folder,
                                         'STRUCTURE/history_structure.dat')
        mass_file_name = os.path.join(design_folder,
                                      'STRUCTURE/lc0_mass_member.dat')
        thickness_file_name = os.path.join(design_folder,
                                           'STRUCTURE/lc0_x_final.dat')
        postpro_file_name = os.path.join(design_folder,
                                         'STRUCTURE/postpro_load_1.dat')

        if os.path.exists(history_file_name) and os.path.exists(
                mass_file_name) and os.path.exists(
                    postpro_file_name) and os.path.exists(thickness_file_name):
            history = numpy.loadtxt(history_file_name,
                                    delimiter=',',
                                    skiprows=1)
            structure_mass = history[-1, 1]
            check = history[-1, 2:5]
            if (check[0] < threshold) and (check[1] < threshold) and (
                    check[2] < threshold):

                if structure_mass > 0.0 and structure_mass < 8000.0:

                    print dsn_index + 1, ': Success'
                    config = spaceio.Config(
                        os.path.join(design_folder, 'config_DSN.cfg'))
                    dvs = pack_structure(config)
                    structure_mass_model.add(dvs, structure_mass)

                    mass_data = numpy.loadtxt(mass_file_name)
                    for index, mass_model in enumerate(mass_models):
                        mass_model.add(dvs, mass_data[index])

                    thickness_data = numpy.loadtxt(thickness_file_name)
                    for index, thickness_model in enumerate(thickness_models):
                        thickness_model.add(dvs, thickness_data[index])

                    structure_area = 0
                    for index, area_model in enumerate(area_models):
                        area = mass_data[index] / thickness_data[
                            index] / float(config.MATERIAL_DENSITY)
                        area_model.add(dvs, area)
                        structure_area += area

                    structure_area_model.add(dvs, structure_area)

                else:
                    print dsn_index + 1, ': Too Big or Too Small'
            else:
                print dsn_index + 1, ': Warning: ', check[0], check[1], check[
                    2]
        else:
            print 'Missing:', dsn_index + 1

    structure_mass_model.save_data(
        os.path.join(build_points_folder,
                     'enriched_points_STRUCTURE_MASS.dat'))
    structure_area_model.save_data(
        os.path.join(build_points_folder,
                     'enriched_points_STRUCTURE_AREA.dat'))

    for index, mass_model in enumerate(mass_models):
        print 'Save MASS: ', index
        mass_model.save_data(
            os.path.join(build_points_folder,
                         'enriched_points_mass_%05d.dat' % (index + 1)))

    for index, thickness_model in enumerate(thickness_models):
        print 'Save THICKNESS: ', index
        thickness_model.save_data(
            os.path.join(build_points_folder,
                         'enriched_points_thickness_%05d.dat' % (index + 1)))

    for index, area_model in enumerate(area_models):
        print 'Save AREA: ', index
        area_model.save_data(
            os.path.join(build_points_folder,
                         'enriched_points_area_%05d.dat' % (index + 1)))
コード例 #6
0
def process_design():

    range_number = 300

    desvar = DesignVariables()

    build_points_folder = 'BUILD_POINTS'

    lift_model = Surfpack('LIFT', desvar.ndim - 2)
    lift_model.load_data(
        os.path.join(build_points_folder,
                     'build_points_struct_lift_model.dat'))
    drag_model = Surfpack('DRAG', desvar.ndim - 2)
    drag_model.load_data(
        os.path.join(build_points_folder,
                     'build_points_struct_drag_model.dat'))

    threshold = 1.0001

    for dsn_index in range(range_number):

        design_folder = 'DESIGNS/DSN_%03d' % (dsn_index + 1)

        print design_folder

        postpro_file_name = os.path.join(design_folder,
                                         'STRUCTURE/postpro_load_1.dat')

        history_file_name = os.path.join(design_folder,
                                         'STRUCTURE/history_structure.dat')
        mass_file_name = os.path.join(design_folder,
                                      'STRUCTURE/lc0_mass_member.dat')
        postpro_file_name = os.path.join(design_folder,
                                         'STRUCTURE/postpro_load_1.dat')

        if os.path.exists(history_file_name) and os.path.exists(
                mass_file_name) and os.path.exists(postpro_file_name):

            history = numpy.loadtxt(history_file_name,
                                    delimiter=',',
                                    skiprows=1)
            structure_mass = history[-1, 1]
            check = history[-1, 2:5]
            if (check[0] < threshold) and (check[1] < threshold) and (
                    check[2] < threshold):

                config = spaceio.Config(
                    os.path.join(design_folder, 'config_DSN.cfg'))
                dvs = desvar.pack(config)
                dvs_filtered = dvs[0:3] + dvs[5:11]

                print dvs_filtered

                with open(postpro_file_name) as fp:
                    for i, line in enumerate(fp):
                        if i == 13:
                            data = line.split(':')[-1].split(',')
                            lift = float(data[0])
                            drag = float(data[1])
                            print lift, drag
                        elif i > 13:
                            break

                lift_model.add(dvs_filtered, lift)
                drag_model.add(dvs_filtered, drag)

    lift_model.save_data(
        os.path.join(build_points_folder,
                     'enriched_points_struct_lift_model.dat'))
    drag_model.save_data(
        os.path.join(build_points_folder,
                     'enriched_points_struct_drag_model.dat'))

    lift_model.build('kriging')
    drag_model.build('kriging')

    lift_model.save_model('struct_lift.sps')
    drag_model.save_model('struct_drag.sps')
コード例 #7
0
ファイル: load_models_perfo.py プロジェクト: juliendm/SPACE
def load_models(filename, project_folder, regime='SUP'):

    # Project

    if os.path.exists(project_folder):
        project = SPACE.io.load_data(
            os.path.join(project_folder, 'project.pkl'))
        project.compile_designs()
        config = project.config
    else:
        config = SPACE.io.Config(filename)
        state = SPACE.io.State()
        project = SPACE.project.Project(config, state, folder=project_folder)

    # Mission

    # mission_data = np.loadtxt('output_spaceplane.dat',skiprows=1)
    # mission_phase = mission_data[:,1]
    # mission_altitude = mission_data[:,2]
    # indexes_phase_asc = [n for n,i in enumerate(mission_phase) if i in [1,2]]
    # indexes_phase_dsc = [n for n,i in enumerate(mission_phase) if i in [3,4,5,6]]
    # indexes_phase_noaero = [n for n,i in enumerate(mission_altitude) if i > 80.0]
    # indexes_phase_dsc_noaero = []
    # indexes_phase_dsc_aero = []
    # for index in indexes_phase_dsc:
    #     if index in indexes_phase_noaero:
    #         indexes_phase_dsc_noaero.append(index)
    #     else:
    #         indexes_phase_dsc_aero.append(index)
    # mission_aoa = mission_data[:,9]
    # mission_mach = mission_data[:,26]
    # mission_reynolds = mission_data[:,27]

    # Plot

    nx = 100

    mach_range = [0.0, 9.0]
    aoa_range = [0.0, 55.0]

    cogs = [0.60 * 17, 0.63 * 17]
    cog_z = -0.3

    ndim = 7
    aero_desvar = DesignVariables()

    model_trim_fwd = Surfpack('TRIM_FWD', ndim)
    model_trim_fwd.load_model(
        os.path.join(project_folder, 'model_TRIM_FWD.sps'))
    model_trim_aft = Surfpack('TRIM_AFT', ndim)
    model_trim_aft.load_model(
        os.path.join(project_folder, 'model_TRIM_AFT.sps'))

    model_trimmed_static_margin_aft = Surfpack('TRIMMED_STATIC_MARGIN_AFT',
                                               ndim)
    model_trimmed_static_margin_aft.load_model(
        os.path.join(project_folder, 'model_TRIMMED_STATIC_MARGIN_AFT.sps'))
    model_trimmed_static_margin_fwd = Surfpack('TRIMMED_STATIC_MARGIN_FWD',
                                               ndim)
    model_trimmed_static_margin_fwd.load_model(
        os.path.join(project_folder, 'model_TRIMMED_STATIC_MARGIN_FWD.sps'))

    model_k_alpha_aft = Surfpack('K_ALPHA_AFT', ndim)
    model_k_alpha_aft.load_model(
        os.path.join(project_folder, 'model_K_ALPHA_AFT.sps'))
    model_k_alpha_fwd = Surfpack('K_ALPHA_FWD', ndim)
    model_k_alpha_fwd.load_model(
        os.path.join(project_folder, 'model_K_ALPHA_FWD.sps'))

    for flag in ['K_ALPHA']:  # ['TRIM','TRIMMED_STATIC_MARGIN']: #

        for shift in [0.0]:

            # Small
            dv1 = 0.5 + shift  # Leading Edge Location
            dv2 = -0.5  # Elevon Length
            dv3 = -0.5  # Span
            dv4 = -0.2 + shift  # Hinge Location
            dv5 = 0.5
            dv6 = 0.5

            # # Elevon
            # dv1 = 0.5 + shift    # Leading Edge Location
            # dv2 = 0.5           # Elevon Length
            # dv3 = -0.5           # Span
            # dv4 = 0.5 + shift   # Hinge Location
            # dv5 = 0.5
            # dv6 = 0.5

            # # # OPTIM
            # dv1 = -0.5 + shift    # Leading Edge Location
            # dv2 = -0.5           # Elevon Length
            # dv3 = -0.5           # Span
            # dv4 = -0.2 + shift   # Hinge Location
            # dv5 = 0.5
            # dv6 = 0.5

            fig = plt.figure()

            plt.title(flag.replace('_', ' '), fontsize=18)
            plt.xlabel('Mach', fontsize=18)
            plt.ylabel('AoA [Deg]', fontsize=18)

            plt.xlim([0, 9])
            plt.ylim([0, 55])
            plt.fill_between([0, 1, 8], [15, 15, 55], [55, 55, 55],
                             color='grey',
                             alpha='0.3',
                             lw=0,
                             zorder=3)
            plt.fill_between([1, 8, 8, 9], [0, 0, 0, 0], [0, 15, 55, 55],
                             color='grey',
                             alpha='0.3',
                             lw=0,
                             zorder=3)

            for index, cog_x in enumerate(cogs):

                MACH = np.linspace(mach_range[0], mach_range[1], nx)
                AOA = np.linspace(aoa_range[0], aoa_range[1], nx)
                MACH, AOA = np.meshgrid(MACH, AOA)
                COEFF = MACH * 0.0

                for ix in range(nx):
                    for iy in range(nx):

                        aero_dvs = aero_desvar.reverse_variable_change(
                            [
                                MACH[ix, iy], 1E7, AOA[ix, iy], 0.0, 0.0, dv1,
                                dv2, dv3, dv4, dv5, dv6
                            ]
                        )  ##### MUST DO BETTER for Reynolds... Must be the one from trajectory!!! FOR REYNOLDS
                        aero_dvs[
                            aero_desvar.
                            rey_index] = 0.0  # Force Reynolds to Reference Trajectory
                        perfo_dvs = aero_to_perfo(aero_dvs)

                        if (flag == 'TRIM'):

                            if index == 0:
                                val = model_trim_fwd.eval(perfo_dvs)
                            else:
                                val = model_trim_aft.eval(perfo_dvs)

                            if val < aero_desvar.bf_bound[0]:
                                val = val - aero_desvar.bf_bound[0]
                            elif val > aero_desvar.bf_bound[1]:
                                val = val - aero_desvar.bf_bound[1]
                            else:
                                val = 0.0

                            COEFF[ix, iy] = val * 180.0 / np.pi

                        elif (flag == 'TRIMMED_STATIC_MARGIN'):

                            if index == 0:
                                COEFF[
                                    ix,
                                    iy] = model_trimmed_static_margin_fwd.eval(
                                        perfo_dvs)
                            else:
                                COEFF[
                                    ix,
                                    iy] = model_trimmed_static_margin_aft.eval(
                                        perfo_dvs)

                        elif (flag == 'K_ALPHA'):

                            if index == 0:
                                COEFF[ix,
                                      iy] = model_k_alpha_fwd.eval(perfo_dvs)
                            else:
                                COEFF[ix,
                                      iy] = model_k_alpha_aft.eval(perfo_dvs)

                        elif (flag == 'EFFICIENCY'):

                            COEFF[ix, iy] = 0.0

                if (flag == 'TRIM'):

                    val = -20.0 * 0.2
                    levels = [-float("inf"), val]
                    if index == 0:
                        hatches = ['\\\\']
                    else:
                        hatches = ['//']
                    plt.contourf(MACH,
                                 AOA,
                                 COEFF,
                                 levels,
                                 colors='none',
                                 edgecolor='r',
                                 hatches=hatches)
                    levels = [val]
                    CS = plt.contour(MACH, AOA, COEFF, levels, colors='k')
                    plt.clabel(CS, inline=1, fontsize=10)

                    val = 30.0 * 0.2
                    levels = [val, float("inf")]
                    if index == 0:
                        hatches = ['\\\\']
                    else:
                        hatches = ['//']
                    plt.contourf(MACH,
                                 AOA,
                                 COEFF,
                                 levels,
                                 colors='none',
                                 edgecolor='r',
                                 hatches=hatches)
                    levels = [val]
                    CS = plt.contour(MACH, AOA, COEFF, levels, colors='k')
                    plt.clabel(CS, inline=1, fontsize=10)

                elif (flag == 'TRIMMED_STATIC_MARGIN'):

                    val = -0.04
                    levels = [-10.0, val]
                    if index == 0:
                        hatches = ['\\\\']
                    else:
                        hatches = ['//']
                    plt.contourf(MACH,
                                 AOA,
                                 COEFF,
                                 levels,
                                 colors='none',
                                 edgecolor='r',
                                 hatches=hatches,
                                 extend='lower')
                    levels = [val]
                    CS = plt.contour(MACH, AOA, COEFF, levels, colors='k')
                    plt.clabel(CS, inline=1, fontsize=10)

                elif (flag == 'K_ALPHA'):

                    val = 4.0
                    levels = [val, 10000.0]
                    if index == 0:
                        hatches = ['\\\\']
                    else:
                        hatches = ['//']
                    plt.contourf(MACH,
                                 AOA,
                                 COEFF,
                                 levels,
                                 colors='none',
                                 edgecolor='r',
                                 hatches=hatches,
                                 extend='lower')
                    levels = [val]
                    CS = plt.contour(MACH, AOA, COEFF, levels, colors='k')
                    plt.clabel(CS, inline=1, fontsize=10)

                elif (flag == 'EFFICIENCY'):

                    levels = [3.0, 3.5, 4.0, 4.5, 5.0, 5.5, 6.0]
                    plt.contour(MACH, AOA, COEFF, levels)

            # plt.plot(mission_mach[indexes_phase_asc], mission_aoa[indexes_phase_asc], color='red')
            # plt.plot(mission_mach[indexes_phase_dsc_noaero], mission_aoa[indexes_phase_dsc_noaero], color='green')
            # plt.plot(mission_mach[indexes_phase_dsc_aero], mission_aoa[indexes_phase_dsc_aero], color='blue')

            fig.savefig(
                os.path.join(project_folder,
                             'fig_' + flag + '_' + str(shift) + '.png'))
            plt.close(fig)
コード例 #8
0
ファイル: process_project.py プロジェクト: juliendm/SPACE
def process_project(project_folder, max_dsn):

    desvar = DesignVariables()

    lift_model = Surfpack('LIFT', desvar.ndim)
    drag_model = Surfpack('DRAG', desvar.ndim)
    force_x_model = Surfpack('FORCE_X', desvar.ndim)
    force_z_model = Surfpack('FORCE_Z', desvar.ndim)
    moment_y_model = Surfpack('MOMENT_Y', desvar.ndim)

    if (max_dsn == "ENRICHED"):

        # Load Data
        lift_model.load_data(
            os.path.join(project_folder, 'enriched_points_lift.dat'))
        drag_model.load_data(
            os.path.join(project_folder, 'enriched_points_drag.dat'))
        force_x_model.load_data(
            os.path.join(project_folder, 'enriched_points_force_x.dat'))
        force_z_model.load_data(
            os.path.join(project_folder, 'enriched_points_force_z.dat'))
        moment_y_model.load_data(
            os.path.join(project_folder, 'enriched_points_moment_y.dat'))

    elif (max_dsn == "BUILD"):

        # Load Data
        lift_model.load_data(
            os.path.join(project_folder, 'build_points_lift.dat'))
        drag_model.load_data(
            os.path.join(project_folder, 'build_points_drag.dat'))
        force_x_model.load_data(
            os.path.join(project_folder, 'build_points_force_x.dat'))
        force_z_model.load_data(
            os.path.join(project_folder, 'build_points_force_z.dat'))
        moment_y_model.load_data(
            os.path.join(project_folder, 'build_points_moment_y.dat'))

    else:

        project = SPACE.io.load_data(
            os.path.join(project_folder, 'project.pkl'))
        project.compile_designs()

        if (max_dsn == "ALL"):
            dsn_number = len(project.designs)
        else:
            dsn_number = int(max_dsn)

        count = 0
        for index in range(dsn_number):
            design_container = project.designs[index]
            design = design_container.design
            if not design is None:
                dvs = desvar.pack(design.config)
                funcs = design.funcs
                if hasattr(funcs, 'LIFT') and hasattr(
                        funcs, 'DRAG') and hasattr(funcs, 'MOMENT_Y'):
                    count += 1
                    lift_model.add(dvs, funcs.LIFT)
                    drag_model.add(dvs, funcs.DRAG)
                    force_x_model.add(dvs, funcs.FORCE_X)
                    force_z_model.add(dvs, funcs.FORCE_Z)
                    moment_y_model.add(dvs, funcs.MOMENT_Y)
                    # print 'done ' + design.folder
                else:
                    print 'missing ' + design.folder
            else:
                print 'missing design'
        print count
        # Save Data
        lift_model.save_data(
            os.path.join(project_folder, 'build_points_lift.dat'))
        drag_model.save_data(
            os.path.join(project_folder, 'build_points_drag.dat'))
        force_x_model.save_data(
            os.path.join(project_folder, 'build_points_force_x.dat'))
        force_z_model.save_data(
            os.path.join(project_folder, 'build_points_force_z.dat'))
        moment_y_model.save_data(
            os.path.join(project_folder, 'build_points_moment_y.dat'))

    # Build Model
    lift_model.build('kriging')
    drag_model.build('kriging')
    force_x_model.build('kriging')
    force_z_model.build('kriging')
    moment_y_model.build('kriging')

    # Save Model
    lift_model.save_model(os.path.join(project_folder, 'model_lift.sps'))
    drag_model.save_model(os.path.join(project_folder, 'model_drag.sps'))
    force_x_model.save_model(os.path.join(project_folder, 'model_force_x.sps'))
    force_z_model.save_model(os.path.join(project_folder, 'model_force_z.sps'))
    moment_y_model.save_model(
        os.path.join(project_folder, 'model_moment_y.sps'))
コード例 #9
0
def response_surface(filename, project_folder, initiate=False, partitions=0):

    # Project

    if os.path.exists(project_folder):
        project = SPACE.io.load_data(
            os.path.join(project_folder, 'project.pkl'))
        project.compile_designs()
        config = project.config
    else:
        config = SPACE.io.Config(filename)
        state = SPACE.io.State()
        project = SPACE.project.Project(config, state, folder=project_folder)

    print '%d design(s) so far' % len(project.designs)

    konfig = copy.deepcopy(config)
    konfig.NUMBER_PART = partitions

    # Design Variables

    desvar = DesignVariables()

    XB = desvar.XB_SUB
    find_next = False
    ini = 0
    ini_dsn_folder = 'DSN_344'

    if initiate:

        nd = 10 * desvar.ndim

        X = LHC_unif(XB, nd)

        lift_model = Surfpack('LIFT', desvar.ndim)
        drag_model = Surfpack('DRAG', desvar.ndim)
        force_z_model = Surfpack('FORCE_Z', desvar.ndim)
        moment_y_model = Surfpack('MOMENT_Y', desvar.ndim)

        for index in range(0, len(X)):

            dvs = X[index]
            desvar.unpack(konfig, dvs)

            lift_model.add(dvs, project.func('LIFT', konfig))
            drag_model.add(dvs, project.func('DRAG', konfig))
            force_z_model.add(dvs, project.func('FORCE_Z', konfig))
            moment_y_model.add(dvs, project.func('MOMENT_Y', konfig))

        lift_model.save_data(
            os.path.join(project_folder, 'build_points_lift.dat'))
        drag_model.save_data(
            os.path.join(project_folder, 'build_points_drag.dat'))
        force_z_model.save_data(
            os.path.join(project_folder, 'build_points_force_z.dat'))
        moment_y_model.save_data(
            os.path.join(project_folder, 'build_points_moment_y.dat'))

    else:

        if (find_next):
            na = ini + 1
        else:
            na = 500

        lift_model = Surfpack('LIFT', desvar.ndim)
        lift_model.load_data(
            os.path.join(project_folder, 'build_points_lift.dat'))

        drag_model = Surfpack('DRAG', desvar.ndim)
        drag_model.load_data(
            os.path.join(project_folder, 'build_points_drag.dat'))

        force_z_model = Surfpack('FORCE_Z', desvar.ndim)
        force_z_model.load_data(
            os.path.join(project_folder, 'build_points_drag.dat'))

        moment_y_model = Surfpack('MOMENT_Y', desvar.ndim)
        moment_y_model.load_data(
            os.path.join(project_folder, 'build_points_moment_y.dat'))

        for ite in range(
                ini, na):  # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

            print 'Ite:', ite

            if ite % 3 == 0:
                current_model = lift_model
            elif ite % 3 == 1:
                current_model = drag_model
            else:
                current_model = moment_y_model

            if ite == ini:
                if (find_next):
                    current_model.build('kriging')
                else:
                    None
            else:
                current_model.build('kriging')

            print 'Model built'

            if ite == ini:
                if (find_next):
                    dvs = current_model.max_variance(XB)
                    np.savetxt(os.path.join(project_folder, 'next_dvs.dat'),
                               dvs,
                               fmt='%.18e',
                               delimiter=', ',
                               newline='\n',
                               header='',
                               footer='',
                               comments='# ')
                    break
                else:
                    dvs = np.loadtxt(os.path.join(project_folder,
                                                  'next_dvs.dat'),
                                     delimiter=', ',
                                     comments='# ')
            else:
                dvs = current_model.max_variance(XB)
                np.savetxt(os.path.join(project_folder, 'next_dvs.dat'),
                           dvs,
                           fmt='%.18e',
                           delimiter=', ',
                           newline='\n',
                           header='',
                           footer='',
                           comments='# ')

            desvar.unpack(konfig, dvs)

            print '-------------------------------'
            print dvs
            print '-------------------------------'

            if ite == ini:
                proc = project.func('AERODYNAMICS', konfig, ini_dsn_folder)
            else:
                proc = project.func('AERODYNAMICS', konfig)

            new_design_container = project.designs[-1]

            proc.wait()
            project.compile_designs()

            new_design = new_design_container.design
            if not new_design is None:
                new_dvs = desvar.pack(new_design.config)
                new_funcs = new_design.funcs
                if hasattr(new_funcs,
                           'LIFT') and hasattr(new_funcs, 'DRAG') and hasattr(
                               new_funcs, 'FORCE_Z') and hasattr(
                                   new_funcs, 'MOMENT_Y'):
                    lift_model.add(new_dvs, new_funcs.LIFT)
                    drag_model.add(new_dvs, new_funcs.DRAG)
                    force_z_model.add(new_dvs, new_funcs.FORCE_Z)
                    moment_y_model.add(new_dvs, new_funcs.MOMENT_Y)

            lift_model.save_data(
                os.path.join(project_folder, 'enriched_points_lift.dat'))
            drag_model.save_data(
                os.path.join(project_folder, 'enriched_points_drag.dat'))
            force_z_model.save_data(
                os.path.join(project_folder, 'enriched_points_force_z.dat'))
            moment_y_model.save_data(
                os.path.join(project_folder, 'enriched_points_moment_y.dat'))

        # Save Models

        lift_model.build('kriging')
        drag_model.build('kriging')
        force_z_model.build('kriging')
        moment_y_model.build('kriging')

        lift_model.save_model(os.path.join(project_folder, 'model_lift.sps'))
        drag_model.save_model(os.path.join(project_folder, 'model_drag.sps'))
        force_z_model.save_model(
            os.path.join(project_folder, 'model_force_z.sps'))
        moment_y_model.save_model(
            os.path.join(project_folder, 'model_moment_y.sps'))
コード例 #10
0
def build(regime='BOTH'):

    models_folder = 'MODELS'
    build_points_folder = 'BUILD_POINTS'
    desvar = DesignVariables()

    if regime == 'ON':
        ndim_struct = desvar.ndim_struct_on
    elif regime == 'OFF':
        ndim_struct = desvar.ndim_struct_off
    elif regime == 'BOTH':
        ndim_struct = desvar.ndim_struct

    n_models = 132

    # for index in range(0,n_models):
    #     print 'MASS',index
    #     mass_model = Surfpack('MASS_%05d' % (index+1), ndim_struct)
    #     mass_model.load_data(os.path.join(build_points_folder,'enriched_points_mass_%05d.dat' % (index+1)))
    #     mass_model.build('kriging')
    #     mass_model.save_model(os.path.join(models_folder,'model_mass_%05d.sps' % (index+1)))

    # for index in range(0,n_models):
    #     print 'AREA',index
    #     area_model = Surfpack('AREA_%05d' % (index+1), ndim_struct)
    #     area_model.load_data(os.path.join(build_points_folder,'enriched_points_area_%05d.dat' % (index+1)))
    #     area_model.build('kriging')
    #     area_model.save_model(os.path.join(models_folder,'model_area_%05d.sps' % (index+1)))

    # for index in range(0,n_models):
    #     print 'THICKNESS',index
    #     thickness_model = Surfpack('THICKNESS_%05d' % (index+1), ndim_struct)
    #     thickness_model.load_data(os.path.join(build_points_folder,'enriched_points_thickness_%05d.dat' % (index+1)))
    #     thickness_model.build('kriging')
    #     thickness_model.save_model(os.path.join(models_folder,'model_thickness_%05d.sps' % (index+1)))

    print 'MASS'
    structure_mass_model = Surfpack('STRUCTURE_MASS', ndim_struct)
    structure_mass_model.load_data(
        os.path.join(build_points_folder,
                     'enriched_points_STRUCTURE_MASS.dat'))
    structure_mass_model.build('kriging')
    structure_mass_model.save_model(
        os.path.join(models_folder, 'model_structure_mass.sps'))

    print 'AREA'
    structure_mass_model = Surfpack('STRUCTURE_AREA', ndim_struct)
    structure_mass_model.load_data(
        os.path.join(build_points_folder,
                     'enriched_points_STRUCTURE_AREA.dat'))
    structure_mass_model.build('kriging')
    structure_mass_model.save_model(
        os.path.join(models_folder, 'model_structure_area.sps'))
コード例 #11
0
def response_surface(filename,
                     project_folder,
                     regime='BOTH',
                     initiate=False,
                     partitions=0):

    # Project

    if os.path.exists(project_folder):
        project = SPACE.io.load_data(
            os.path.join(project_folder, 'project.pkl'))
        project.compile_designs()
        config = project.config
    else:
        config = SPACE.io.Config(filename)
        state = SPACE.io.State()
        project = SPACE.project.Project(config, state, folder=project_folder)

    print '%d design(s) so far' % len(project.designs)

    config.NUMBER_PART = 0

    # Design Variables
    desvar = DesignVariables()

    # Load All Aero Models
    #load_aero_models()

    if regime == 'ON':
        XB = desvar.XB_STRUCT_ON
        ndim_struct = desvar.ndim_struct_on
        unpack_structure = desvar.unpack_structure_on
        pack_structure = desvar.pack_structure_on

        dry_mass_index = 3
        fuel_mass_index = 4
        thrust_index = 5
        pdyn_index = 6

        dv1_index = 7
        dv2_index = 8
        dv3_index = 9
        dv4_index = 10
        dv5_index = 11
        dv6_index = 12

        dvs_baseline = [
            1.1, 0.0, 1.0, 20.0e3, 20.0e3, 2.5e6, 20.0e3, 0.0, 0.0, 0.0, 0.0,
            0.0, 0.0
        ]

    elif regime == 'OFF':

        XB = desvar.XB_STRUCT_OFF
        ndim_struct = desvar.ndim_struct_off
        unpack_structure = desvar.unpack_structure_off
        pack_structure = desvar.pack_structure_off

    elif regime == 'BOTH':

        XB = desvar.XB_STRUCT
        ndim_struct = desvar.ndim_struct
        unpack_structure = desvar.unpack_structure
        pack_structure = desvar.pack_structure

        mach_index = 0
        rey_index = 1
        aoa_index = 2

        nx_index = 3
        nz_index = 4

        thrust_index = 5
        pdyn_index = 6
        fuel_mass_index = 7

        dv1_index = 8
        dv2_index = 9
        dv3_index = 10
        dv4_index = 11
        dv5_index = 12
        dv6_index = 13

        dvs_baseline = [
            1.1, 0.0, 1.0, 3.0, -3.0, 1.5e6, 20.0e3, 20.0e3, 0.0, 0.0, 0.0,
            0.0, 0.0, 0.0
        ]

        # Midpoint
        dvs_baseline = [
            4.5, 0.0, 0.0, 3.0, -3.0, 1.5e6, 20.0e3, 14.0e3, 0.0, 0.0, 0.0,
            0.0, 0.0, 0.0
        ]

    if initiate:

        vals = np.linspace(-0.5, 0.5, 10.0)
        new_dvs_vec = []
        for val in vals:
            dvs = copy.copy(dvs_baseline)
            dvs[dv2_index] = val
            new_dvs_vec.append(dvs)

        procs = []

        for new_dvs in new_dvs_vec:

            print 'New dvs: ', new_dvs

            konfig = copy.deepcopy(config)
            unpack_structure(konfig, new_dvs)

            proc = project.func('STRUCTURE', konfig)
            procs.append(proc)

        for proc in procs:
            proc.wait()

        vals = np.linspace(-0.5, 0.5, 10.0)
        new_dvs_vec = []
        for val in vals:
            dvs = copy.copy(dvs_baseline)
            dvs[dv3_index] = val
            new_dvs_vec.append(dvs)

        procs = []

        for new_dvs in new_dvs_vec:

            print 'New dvs: ', new_dvs

            konfig = copy.deepcopy(config)
            unpack_structure(konfig, new_dvs)

            proc = project.func('STRUCTURE', konfig)
            procs.append(proc)

        for proc in procs:
            proc.wait()

        # # nd = ndim_struct * 10
        # nd = 300

        # dvs_struct_filename = 'dvs_struct_' + regime + '.dat'

        # # X = LHC_unif(XB,nd)
        # # np.savetxt(dvs_struct_filename,X)

        # X = np.loadtxt(dvs_struct_filename)

        # for index_1 in range(nd/partitions):
        #     procs = []
        #     for index_2 in range(partitions):
        #         index = index_1*partitions+index_2

        #         dvs = X[index]

        #         konfig = copy.deepcopy(config)
        #         unpack_structure(konfig, dvs)

        #         proc = project.func('STRUCTURE', konfig)

        #         # force_redo_dsn_folder = None #'DSN_001'
        #         # proc = project.func('STRUCTURE', konfig, force_redo_dsn_folder)

        #         procs.append(proc)

        #     for proc in procs:
        #         proc.wait()

    else:

        na = 20
        number_per_ite = 12

        #        flag = 'DRY_MASS'     # WHICH ONE ???????
        flag = 'STRUCTURE_MASS'

        threshold = 1.0001

        build_points_folder = os.path.join(project_folder, 'BUILD_POINTS')

        model = Surfpack(flag, ndim_struct)
        model.load_data(
            os.path.join(build_points_folder, 'build_points_' + flag + '.dat'))
        exclude = []

        next_dvs_vec_filename = 'next_dvs_vec_' + regime + '.dat'

        # new_dvs_vec = []
        # for dsn_index in range(12):
        #     design_folder = os.path.join(project_folder,'DESIGNS/DSN_%03d' % (dsn_index+1))
        #     local_config = SPACE.io.Config(os.path.join(design_folder,'config_DSN.cfg'))
        #     local_dvs = pack_structure(local_config)
        #     new_dvs_vec.append(local_dvs)
        # np.savetxt(next_dvs_vec_filename, new_dvs_vec)

        print 'Begin Iterating:'

        for ite in range(na):

            print 'Ite:', ite

            # NEW POINTS

            if ite == 0:

                new_dvs_vec = np.loadtxt(next_dvs_vec_filename)

            else:

                model.build('kriging')
                print 'Model built'

                new_dvs_vec = model.max_variance(XB,
                                                 number=number_per_ite,
                                                 exclude=exclude)
                np.savetxt(next_dvs_vec_filename, new_dvs_vec)

            effective_number_per_ite = len(new_dvs_vec)

            # COMPUTE

            procs = []

            number_design_before = len(project.designs)

            for new_dvs in new_dvs_vec:

                print 'New dvs: ', new_dvs

                konfig = copy.deepcopy(config)
                unpack_structure(konfig, new_dvs)

                proc = project.func('STRUCTURE', konfig)
                procs.append(proc)

            for proc in procs:
                proc.wait()

            number_design_after = len(project.designs)

            # READ RESULTS

            #           for dsn_index in range(number_design_after-effective_number_per_ite,number_design_after):

            model = Surfpack(flag + '_' + str(ite), ndim_struct)
            #            model.load_data(os.path.join(build_points_folder,'build_points_' + flag + '.dat'))
            exclude = []
            for dsn_index in range(0, number_design_after):

                design_folder = os.path.join(
                    project_folder, 'DESIGNS/DSN_%03d' % (dsn_index + 1))

                history_file_name = os.path.join(
                    design_folder, 'STRUCTURE/history_structure.dat')
                postpro_file_name = os.path.join(
                    design_folder, 'STRUCTURE/postpro_load_1.dat')
                mass_file_name = os.path.join(
                    design_folder,
                    'STRUCTURE/lc0_mass_member.dat')  # TO CHECK IF DONE INDEED

                if os.path.exists(history_file_name) and os.path.exists(
                        postpro_file_name) and os.path.exists(mass_file_name):

                    history = np.loadtxt(history_file_name,
                                         delimiter=',',
                                         skiprows=1)

                    half_structure_mass = history[-1, 1]

                    local_config = SPACE.io.Config(
                        os.path.join(design_folder, 'config_DSN.cfg'))
                    local_dvs = pack_structure(local_config)

                    # ADD VALUE

                    check = history[-1, 2:5]
                    if (check[0] < threshold) and (check[1] < threshold) and (
                            check[2] < threshold):

                        if flag == 'STRUCTURE_MASS':
                            model.add(local_dvs, half_structure_mass)
                        elif flag == 'DRY_MASS':
                            raise ValueError(
                                'Do not use, not correctly defined')

                    else:
                        exclude.append(local_dvs)
                        print 'Warning:', dsn_index + 1
                else:
                    print 'Missing:', dsn_index + 1

            model.save_data(
                os.path.join(build_points_folder,
                             'enriched_points_' + flag + '.dat'))

        # Save Model

        model.build('kriging')
        model.save_model(os.path.join(project_folder,
                                      'model_' + flag + '.sps'))
コード例 #12
0
def load_aero_models():

    n_models = 2180

    models_folder = 'RESPONSE_SURFACE_DV_SUP/DESIGNS/MODELS'

    for index in range(n_models):
        cp_model = Surfpack('CP_%05d' % (index + 1), desvar.ndim)
        cp_model.load_model(
            os.path.join(models_folder, 'model_cp_%05d.sps' % (index + 1)))

    for index in range(n_models):
        cfx_model = Surfpack('CFX_%05d' % (index + 1), desvar.ndim)
        cfx_model.load_model(
            os.path.join(models_folder, 'model_cfx_%05d.sps' % (index + 1)))

    for index in range(n_models):
        cfy_model = Surfpack('CFY_%05d' % (index + 1), desvar.ndim)
        cfy_model.load_model(
            os.path.join(models_folder, 'model_cfy_%05d.sps' % (index + 1)))

    for index in range(n_models):
        cfz_model = Surfpack('CFZ_%05d' % (index + 1), desvar.ndim)
        cfz_model.load_model(
            os.path.join(models_folder, 'model_cfz_%05d.sps' % (index + 1)))