def _getUpdatedSurface(self, fName='export.x'): """Return the updated surface for the currently set design variables, converted to an unstructured format. Note that this routine is safe to call in an embarrassing parallel fashion. That is it can be called with different DVs set on different processors and they won't interfere with each other. """ import time # Set each of the DVs. We have the parmID stored so its easy. for dvName in self.DVs: DV = self.DVs[dvName] # We use float here since sometimes pyoptsparse will give # stupid numpy zero-dimensional arrays, which swig does # not like. vsp.SetParmVal(DV.parmID, float(DV.value)) vsp.Update() # Write the export file. fName = os.path.join(self.tmpDir, fName) vsp.ExportFile(fName, self.exportSet, vsp.EXPORT_PLOT3D) # Now we load in this updated plot3d file and compute the # connectivity if not already done. computeConn = False if self.conn is None: computeConn = True pts, conn, cumSizes, sizes = self._readPlot3DSurfFile( fName, computeConn) # Apply the VSP scale newPts = pts * self.vspScale return newPts, conn, cumSizes, sizes
def export(self, filename=None, vsp_set=0, file_format=ExportCode.EXPORT_STL): if filename is None: # TODO: map extension to file_format filename = self.__filename.split('.')[0] + '.stl' if isinstance(file_format, ExportCode): file_format = file_format.value vsp.ExportFile(filename, vsp_set, file_format)
def writePlot3D(self, fileName): """Write the current design to Plot3D file""" for dvName in self.DVs: DV = self.DVs[dvName] # We use float here since sometimes pyoptsparse will give # stupid numpy zero-dimensional arrays, which swig does # not like. vsp.SetParmVal(DV.parmID, float(DV.value)) vsp.Update() # Write the export file. vsp.ExportFile(fileName, self.exportSet, vsp.EXPORT_PLOT3D)
def write(vehicle, tag, fuel_tank_set_ind=3, verbose=True, write_file=True, OML_set_ind = 4, write_igs = False): """This writes a SUAVE vehicle to OpenVSP format. It will take wing segments into account if they are specified in the vehicle setup file. Assumptions: Vehicle is composed of conventional shape fuselages, wings, and propulsors. Any propulsor that should be created is tagged as 'turbofan'. Source: N/A Inputs: vehicle. tag [-] wings.*. (* is all keys) origin [m] in all three dimensions spans.projected [m] chords.root [m] chords.tip [m] sweeps.quarter_chord [radians] twists.root [radians] twists.tip [radians] thickness_to_chord [-] dihedral [radians] tag <string> Segments.*. (optional) twist [radians] percent_span_location [-] .1 is 10% root_chord_percent [-] .1 is 10% dihedral_outboard [radians] sweeps.quarter_chord [radians] thickness_to_chord [-] propulsors.turbofan. (optional) number_of_engines [-] engine_length [m] nacelle_diameter [m] origin [m] in all three dimension, should have as many origins as engines OpenVSP_simple (optional) <boolean> if False (default) create a flow through nacelle, if True creates a roughly biparabolic shape fuselages.fuselage (optional) width [m] lengths.total [m] heights. maximum [m] at_quarter_length [m] at_wing_root_quarter_chord [m] at_three_quarters_length [m] effective_diameter [m] fineness.nose [-] ratio of nose section length to fuselage width fineness.tail [-] ratio of tail section length to fuselage width tag <string> OpenVSP_values. (optional) nose.top.angle [degrees] nose.top.strength [-] this determines how much the specified angle influences that shape nose.side.angle [degrees] nose.side.strength [-] nose.TB_Sym <boolean> determines if top angle is mirrored on bottom nose.z_pos [-] z position of the nose as a percentage of fuselage length (.1 is 10%) tail.top.angle [degrees] tail.top.strength [-] tail.z_pos (optional, 0.02 default) [-] z position of the tail as a percentage of fuselage length (.1 is 10%) fuel_tank_set_index <int> OpenVSP object set containing the fuel tanks Outputs: <tag>.vsp3 This is the OpenVSP representation of the aircraft Properties Used: N/A """ # Reset OpenVSP to avoid including a previous vehicle if verbose: print('Reseting OpenVSP Model in Memory') try: vsp.ClearVSPModel() except NameError: print('VSP import failed') return -1 area_tags = dict() # for wetted area assignment # ------------- # Wings # ------------- # Default Set_0 in OpenVSP is index 3 vsp.SetSetName(fuel_tank_set_ind, 'fuel_tanks') vsp.SetSetName(OML_set_ind, 'OML') for wing in vehicle.wings: if verbose: print('Writing '+wing.tag+' to OpenVSP Model') area_tags, wing_id = write_vsp_wing(wing,area_tags, fuel_tank_set_ind, OML_set_ind) if wing.tag == 'main_wing': main_wing_id = wing_id # ------------- # Engines # ------------- ## Skeleton code for props and pylons can be found in previous commits (~Dec 2016) if desired ## This was a place to start and may not still be functional if 'turbofan' in vehicle.propulsors: if verbose: print('Writing '+vehicle.propulsors.turbofan.tag+' to OpenVSP Model') turbofan = vehicle.propulsors.turbofan write_vsp_turbofan(turbofan, OML_set_ind) if 'turbojet' in vehicle.propulsors: turbofan = vehicle.propulsors.turbojet write_vsp_turbofan(turbofan, OML_set_ind) # ------------- # Fuselage # ------------- for key, fuselage in vehicle.fuselages.items(): if verbose: print('Writing '+fuselage.tag+' to OpenVSP Model') try: area_tags = write_vsp_fuselage(fuselage, area_tags, vehicle.wings.main_wing, fuel_tank_set_ind, OML_set_ind) except AttributeError: area_tags = write_vsp_fuselage(fuselage, area_tags, None, fuel_tank_set_ind, OML_set_ind) vsp.Update() # Write the vehicle to the file if write_file ==True: cwd = os.getcwd() filename = tag + ".vsp3" if verbose: print('Saving OpenVSP File at '+ cwd + '/' + filename) vsp.WriteVSPFile(filename) elif verbose: print('Not Saving OpenVSP File') if write_igs: if verbose: print('Exporting IGS File') vehicle_id = vsp.FindContainersWithName('Vehicle')[0] parm_id = vsp.FindParm(vehicle_id,'LabelID','IGESSettings') vsp.SetParmVal(parm_id, 0.) vsp.ExportFile(tag + ".igs", OML_set_ind, vsp.EXPORT_IGES) return area_tags