Ejemplo n.º 1
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'))
Ejemplo n.º 2
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'))