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