예제 #1
0
파일: vspaero.C 프로젝트: hmxa91/Urban-UAV
void StabilityAndControlSolve(void)
{

    int Case, Case0, Deriv;

    Delta_AoA_  = 0.100;
    Delta_Beta_ = 0.100;
    Delta_Mach_ = 0.100;
    Delta_P_    = 0.001;
    Delta_Q_    = 0.001;
    Delta_R_    = 0.001;

    Case = 1;

    Case0 = Case;

    for ( Deriv = 1 ; Deriv <= 7 ; Deriv++ ) {

        MachList_[Case] = Mach_;
       AlphaList_[Case] = AoA_;
        BetaList_[Case] = Beta_;

       RotationalRate_pList_[Case] = 0.;
       RotationalRate_qList_[Case] = 0.;
       RotationalRate_rList_[Case] = 0.;

       Case++;

    }

    // Perturb in alpha
                 
    AlphaList_[Case0 + 1] = AoA_ + Delta_AoA_;
     
    // Perturb in Beta
        
    BetaList_[Case0 + 2] = Beta_ + Delta_Beta_;
    
    // Perturb roll rate

    RotationalRate_pList_[Case0 + 3] = Delta_P_;
    RotationalRate_qList_[Case0 + 3] = 0.;
    RotationalRate_rList_[Case0 + 3] = 0.;    

    // Perturb pitch rate

    RotationalRate_pList_[Case0 + 4] = 0.;
    RotationalRate_qList_[Case0 + 4] = Delta_Q_;
    RotationalRate_rList_[Case0 + 4] = 0.;    
    
    // Perturb yaw rate

    RotationalRate_pList_[Case0 + 5] = 0.;
    RotationalRate_qList_[Case0 + 5] = 0.;
    RotationalRate_rList_[Case0 + 5] = Delta_R_;  
    
    // Perturb Mach number

    MachList_[Case0 + 6] = Mach_ + Delta_Mach_;
 
    printf("Doing stability and control run... \n"); 

    for ( Case = 1 ; Case <= NumStabCases_ ; Case++ ) {

       printf("Calculating stability and control case: %d of %d \n",Case,NumStabCases_);
       
       // Set free stream conditions
       
       VSP_VLM().Mach()          = MachList_[Case];
       VSP_VLM().AngleOfAttack() = AlphaList_[Case] * TORAD;
       VSP_VLM().AngleOfBeta()   = BetaList_[Case] * TORAD;

       VSP_VLM().RotationalRate_p() = RotationalRate_pList_[Case];
       VSP_VLM().RotationalRate_q() = RotationalRate_qList_[Case];
       VSP_VLM().RotationalRate_r() = RotationalRate_rList_[Case];

       // Solve this case
       
       VSP_VLM().SaveRestartFile() = VSP_VLM().DoRestart() = 0;
      
       if ( Case == 1 ) VSP_VLM().SaveRestartFile() = 1;

       if ( Case > 1 ) VSP_VLM().DoRestart() = 1;
       
       if ( Case < NumStabCases_ ) {
          
          VSP_VLM().Solve(Case);
          
       }
       
       else {
          
          VSP_VLM().Solve(-Case);
          
       }         
          
       // Store aero coefficients
  
       CLForCase[Case] = VSP_VLM().CL(); 
       CDForCase[Case] = VSP_VLM().CD();        
       CSForCase[Case] = VSP_VLM().CS();        

       CFxForCase[Case] = VSP_VLM().CFx();
       CFyForCase[Case] = VSP_VLM().CFy();       
       CFzForCase[Case] = VSP_VLM().CFz();       
           
       CMxForCase[Case] = VSP_VLM().CMx();       
       CMyForCase[Case] = VSP_VLM().CMy();       
       CMzForCase[Case] = VSP_VLM().CMz();     

       printf("\n");

    }

    // Now calculate actual stability derivatives 
    
    CalculateStabilityDerivatives();

}
예제 #2
0
파일: vspaero.C 프로젝트: hmxa91/Urban-UAV
void LoadCaseFile(void)
{

    int i, j;
    float x,y,z;
    FILE *case_file;
    char file_name_w_ext[2000], DumChar[200];
    char SymmetryFlag[80];

    // Open the case file

    sprintf(file_name_w_ext,"%s.vspaero",FileName);

    if ( (case_file = fopen(file_name_w_ext,"r")) == NULL ) {

       printf("Could not open the file: %s for input! \n",file_name_w_ext);

       exit(1);

    }

    Sref_              = 1.0;
    Cref_              = 1.0;
    Bref_              = 1.0;
    Xcg_               = 0.0;
    Ycg_               = 0.0;
    Zcg_               = 0.0;
    Mach_              = 0.3;
    AoA_               = 5.0;
    Beta_              = 0.0;
    Vinf_              = 100.;
    Rho_               = 0.002377;
    ReCref_            = 10000000.;
    ClMax_             = -1.;
    MaxTurningAngle_   = -1.;
    FarDist_           = -1.;
    NumberOfWakeNodes_ = -1;
    WakeIterations_    = 5;

    fscanf(case_file,"Sref = %lf \n",&Sref_);
    fscanf(case_file,"Cref = %lf \n",&Cref_);
    fscanf(case_file,"Bref = %lf \n",&Bref_);
    fscanf(case_file,"X_cg = %lf \n",&Xcg_);
    fscanf(case_file,"Y_cg = %lf \n",&Ycg_);
    fscanf(case_file,"Z_cg = %lf \n",&Zcg_);
    fscanf(case_file,"Mach = %lf \n",&Mach_);
    fscanf(case_file,"AoA = %lf \n",&AoA_);
    fscanf(case_file,"Beta = %lf \n",&Beta_);
    fscanf(case_file,"Vinf = %lf \n",&Vinf_);
    fscanf(case_file,"Rho = %lf \n",&Rho_);
    fscanf(case_file,"ReCref = %lf \n",&ReCref_);
    fscanf(case_file,"ClMax = %lf \n",&ClMax_);
    fscanf(case_file,"MaxTurningAngle = %lf \n",&MaxTurningAngle_);
    fscanf(case_file,"Symmetry = %s \n",SymmetryFlag);
    fscanf(case_file,"FarDist = %lf \n",&FarDist_);
    fscanf(case_file,"NumWakeNodes = %d \n",&NumberOfWakeNodes_);
    fscanf(case_file,"WakeIters = %d \n",&WakeIterations_);
    
    if ( FarDist_ > 0. ) SetFarDist_ = 1;
    
    if ( WakeIterations_ <= 0 ) WakeIterations_ = 1;

    if ( ClMax_ <= 0. ) ClMax_ = -1.;

    if ( MaxTurningAngle_ <= 0. ) MaxTurningAngle_ = -1.;

    printf("Sref            = %lf \n",Sref_);
    printf("Cref            = %lf \n",Cref_);
    printf("Bref            = %lf \n",Bref_);
    printf("X_cg            = %lf \n",Xcg_);
    printf("Y_cg            = %lf \n",Ycg_);
    printf("Z_cg            = %lf \n",Zcg_);
    printf("Mach            = %lf \n",Mach_);
    printf("AoA             = %lf \n",AoA_);
    printf("Beta            = %lf \n",Beta_);
    printf("Vinf            = %lf \n",Vinf_);
    printf("Rho             = %lf \n",Rho_);
    printf("ReCref          = %lf \n",ReCref_);
    printf("ClMax           = %lf \n",ClMax_);
    printf("MaxTurningAngle = %lf \n",MaxTurningAngle_);
    printf("Symmetry        = %s  \n",SymmetryFlag);
    printf("FarDist         = %lf \n",FarDist_);
    printf("NumWakeNodes    = %d  \n",NumberOfWakeNodes_);
    printf("WakeIters       = %d  \n",WakeIterations_);

    VSP_VLM().Sref() = Sref_;
    VSP_VLM().Cref() = Cref_;
    VSP_VLM().Bref() = Bref_;

    VSP_VLM().Xcg() = Xcg_;
    VSP_VLM().Ycg() = Ycg_;
    VSP_VLM().Zcg() = Zcg_;
    
    VSP_VLM().Mach() = Mach_;
    VSP_VLM().AngleOfAttack() = AoA_ * TORAD;
    VSP_VLM().AngleOfBeta() = Beta_ * TORAD;
    
    VSP_VLM().Vinf() = Vinf_;
    
    VSP_VLM().Density() = Rho_;
    
    VSP_VLM().ReCref() = ReCref_;
    
    VSP_VLM().ClMax() = ClMax_;
    
    VSP_VLM().MaxTurningAngle() = MaxTurningAngle_;

    VSP_VLM().WakeIterations() = WakeIterations_;
    
    VSP_VLM().RotationalRate_p() = 0.0;
    VSP_VLM().RotationalRate_q() = 0.0;
    VSP_VLM().RotationalRate_r() = 0.0;    
    
    if ( strcmp(SymmetryFlag,"X") == 0 ) DoSymmetry_ = SYM_X;
    if ( strcmp(SymmetryFlag,"Y") == 0 ) DoSymmetry_ = SYM_Y;
    if ( strcmp(SymmetryFlag,"Z") == 0 ) DoSymmetry_ = SYM_Z;
        
    // Load in the rotor data
    
    NumberOfRotors_ = 0;
    
    fscanf(case_file,"NumberOfRotors = %d \n",&NumberOfRotors_);
    
    printf("NumberOfRotors: %d \n",NumberOfRotors_);
    
    VSP_VLM().SetNumberOfRotors(NumberOfRotors_);
    
    for ( i = 1 ; i <= NumberOfRotors_ ; i++ ) {
     
       fgets(DumChar,200,case_file);
       fgets(DumChar,200,case_file);
       
       printf("\nLoading data for rotor: %5d \n",i);
       
       VSP_VLM().RotorDisk(i).Load_STP_Data(case_file);
       
    }
    
    // Load in the velocity survey data

    fscanf(case_file,"NumberofSurveyPoints = %d \n",&NumberofSurveyPoints_);

    printf("NumberofSurveyPoints: %d \n",NumberofSurveyPoints_);

    VSP_VLM().SetNumberOfSurveyPoints(NumberofSurveyPoints_);

    for ( i = 1 ; i <= NumberofSurveyPoints_ ; i++ ) {

       fscanf(case_file,"%d %f %f %f \n",&j,&x,&y,&z);

       printf("Survey Point: %10d: %10.5f %10.5f %10.5f \n",i,x,y,z);

       VSP_VLM().SurveyPointList(i).x() = x;
       VSP_VLM().SurveyPointList(i).y() = y;
       VSP_VLM().SurveyPointList(i).z() = z;

    }

    fclose(case_file);

}
예제 #3
0
파일: vspaero.C 프로젝트: hmxa91/Urban-UAV
int main(int argc, char **argv)
{

    // Grab the file name
    
    FileName = argv[argc-1];

    // Parse the input

    ParseInput(argc,argv);

    // Output a header

    printf("VSPAERO v.2.1 --- 3/10/2015 \n");
    printf("\n\n\n\n");
    
#ifdef VSPAERO_OPENMP
    printf("Initializing OPENMP for %d threads \n",NumberOfThreads_);
    
    omp_set_num_threads(NumberOfThreads_);
    
    NumberOfThreads_ = omp_get_max_threads();

    printf("NumberOfThreads_: %d \n",NumberOfThreads_);
#else
    NumberOfThreads_ = 1;
    printf("Single threaded build.\n");
#endif
                    
    // Load in the case file

    LoadCaseFile();
    
    // Load in the VSP degenerate geometry file
    
    VSP_VLM().ReadFile(FileName);
    
    // Command line arguments over-ride any inputs in the case file
    
    if ( SetFreeStream_ ) {
     
       Mach_ = Set_Mach_;
       AoA_  = Set_AoA_;
       Beta_ = Set_Beta_;
       
       VSP_VLM().Mach() = Mach_;
       VSP_VLM().AngleOfAttack() = AoA_ * TORAD;
       VSP_VLM().AngleOfBeta() = Beta_ * TORAD;       
       
    }
   
    // Solve
    
    VSP_VLM().Setup();
    
    // Symmetry options
    
    if ( DoSymmetry_ == SYM_X ) VSP_VLM().DoSymmetryPlaneSolve(SYM_X);
    if ( DoSymmetry_ == SYM_Y ) VSP_VLM().DoSymmetryPlaneSolve(SYM_Y);
    if ( DoSymmetry_ == SYM_Z ) VSP_VLM().DoSymmetryPlaneSolve(SYM_Z);
    
    // Force farfield distance for wake adaption
    
    if ( SetFarDist_ ) VSP_VLM().SetFarFieldDist(FarDist_);
    
    // Set number of farfield wake nodes
    
    if ( NumberOfWakeNodes_ > 0 ) VSP_VLM().SetNumberOfWakeTrailingNodes(NumberOfWakeNodes_);
     
    // Geometry dump, no solver
    
    if ( DumpGeom_ ) VSP_VLM().DumpGeom() = 1;
    
    // Force no wakes for some number of iterations
    
    if ( NoWakeIteration_ > 0 ) VSP_VLM().NoWakeIteration() = NoWakeIteration_;
    
    // Use force averaging
    
    if ( ForceAveragingIter_ > 0 ) {
       
       VSP_VLM().ForceType() = FORCE_AVERAGE;
       
       VSP_VLM().AveragingIteration() = ForceAveragingIter_;
       
    }
        
    if ( !StabControlRun_ ) {
 
       VSP_VLM().RotationalRate_p() = 0.;
       VSP_VLM().RotationalRate_q() = 0.;
       VSP_VLM().RotationalRate_r() = 0.;
       
       if ( SaveRestartFile_ ) VSP_VLM().SaveRestartFile() = 1;
   
       if ( DoRestartRun_    ) VSP_VLM().DoRestart() = 1;
               
       VSP_VLM().Solve();

       VSP_VLM().WriteOutAerothermalDatabaseFiles();
       
    }
    
    else {
     
       StabilityAndControlSolve();
       
    }

    printf("Done!\n");
}
예제 #4
0
파일: vspaero.C 프로젝트: hmxa91/Urban-UAV
void CreateInputFile(char *argv[], int argc, int &i)
{

    FILE *case_file;
    char file_name_w_ext[2000];

    // Defaults

    Sref_              = 1.0;
    Cref_              = 1.0;  
    Bref_              = 1.0; 
    Xcg_               = 0.0;
    Ycg_               = 0.0;
    Zcg_               = 0.0;
    Mach_              = 0.3;
    AoA_               = 5.0;
    Beta_              = 0.0;
    Vinf_              = 100.;
    Rho_               = 0.002377;
    ReCref_            = 10000000.;
    ClMax_             = -1.;
    MaxTurningAngle_   = -1.;
    FarDist_           = -1.;
    NumberOfWakeNodes_ = -1;
    WakeIterations_    = 5;
    NumberOfRotors_    = 0.;

    // Read in the degen geometry file

    VSP_VLM().ReadFile(FileName);

    // Open the case file

    sprintf(file_name_w_ext,"%s.vspaero",FileName);

    if ( (case_file = fopen(file_name_w_ext,"w")) == NULL ) {

       printf("Could not open the file: %s for input! \n",file_name_w_ext);

       exit(1);

    }
    
    // Check for any user supplied values on the command line
    
    while ( i <= argc - 2 ) {
    
       if ( strcmp(argv[i],"-sref") == 0 ) {
          
          Sref_ = atof(argv[++i]);
          
       }
       
       else if ( strcmp(argv[i],"-sref") == 0 ) {
          
          Sref_ = atof(argv[++i]);
          
       }
       
       else if ( strcmp(argv[i],"-cref") == 0 ) {
          
          Cref_ = atof(argv[++i]);
          
       }
       
       else if ( strcmp(argv[i],"-bref") == 0 ) {
          
          Bref_ = atof(argv[++i]);
          
       }                     

       else if ( strcmp(argv[i],"-cg") == 0 ) {
          
          Xcg_ = atof(argv[++i]);
          
          Ycg_ = atof(argv[++i]);
          
          Zcg_ = atof(argv[++i]);
          
       }     
       
       else if ( strcmp(argv[i],"-mach") == 0 ) {
          
          Mach_ = atof(argv[++i]);
          
       }     
       
       else if ( strcmp(argv[i],"-aoa") == 0 ) {
          
          AoA_ = atof(argv[++i]);
          
       }     
       
       else if ( strcmp(argv[i],"-beta") == 0 ) {
          
          Beta_ = atof(argv[++i]);
          
       }    
       
       i++; 
       
    }
                                
    fprintf(case_file,"Sref = %lf \n",Sref_);
    fprintf(case_file,"Cref = %lf \n",Cref_);
    fprintf(case_file,"Bref = %lf \n",Bref_);
    fprintf(case_file,"X_cg = %lf \n",Xcg_);
    fprintf(case_file,"Y_cg = %lf \n",Ycg_);
    fprintf(case_file,"Z_cg = %lf \n",Zcg_);
    fprintf(case_file,"Mach = %lf \n",Mach_);
    fprintf(case_file,"AoA = %lf \n",AoA_);
    fprintf(case_file,"Beta = %lf \n",Beta_);
    fprintf(case_file,"Vinf = %lf \n",Vinf_);
    fprintf(case_file,"Rho = %lf \n",Rho_);
    fprintf(case_file,"ReCref = %lf \n",ReCref_);
    fprintf(case_file,"ClMax = %lf \n",ClMax_);
    fprintf(case_file,"MaxTurningAngle = %lf \n",MaxTurningAngle_);
    fprintf(case_file,"Symmetry = No \n");
    fprintf(case_file,"FarDist = %lf \n",FarDist_);
    fprintf(case_file,"NumWakeNodes = %d \n",NumberOfWakeNodes_);
    fprintf(case_file,"WakeIters = %d \n",WakeIterations_);

    printf("VSP_VLM().VSPGeom().NumberOfRotors(): %d \n",VSP_VLM().VSPGeom().NumberOfRotors());

    if ( VSP_VLM().VSPGeom().NumberOfRotors() != 0 ) NumberOfRotors_ = VSP_VLM().VSPGeom().NumberOfRotors();

    fprintf(case_file,"NumberOfRotors = %d \n",NumberOfRotors_);

    for ( i = 1 ;  i <= NumberOfRotors_ ; i++ ) {

       fprintf(case_file,"PropElement_%-d\n",i);
       fprintf(case_file,"%d\n",i);

       VSP_VLM().VSPGeom().RotorDisk(i).Write_STP_Data(case_file);

    }

    fclose(case_file);
 
}
예제 #5
0
void LoadCaseFile(void)
{

    int i;
    FILE *case_file;
    char file_name_w_ext[80], DumChar[200];
    char SymmetryFlag[80];

    // Open the case file

    sprintf(file_name_w_ext,"%s.vspaero",FileName);

    if ( (case_file = fopen(file_name_w_ext,"r")) == NULL ) {

       printf("Could not open the file: %s for input! \n",file_name_w_ext);

       exit(1);

    }

    FarDist_ = -1.;

    fscanf(case_file,"Sref = %lf \n",&Sref_);
    fscanf(case_file,"Cref = %lf \n",&Cref_);
    fscanf(case_file,"Bref = %lf \n",&Bref_);
    fscanf(case_file,"X_cg = %lf \n",&Xcg_);
    fscanf(case_file,"Y_cg = %lf \n",&Ycg_);
    fscanf(case_file,"Z_cg = %lf \n",&Zcg_);
    fscanf(case_file,"Mach = %lf \n",&Mach_);
    fscanf(case_file,"AoA = %lf \n",&AoA_);
    fscanf(case_file,"Beta = %lf \n",&Beta_);
    fscanf(case_file,"Vinf = %lf \n",&Vinf_);
    fscanf(case_file,"Rho = %lf \n",&Rho_);
    fscanf(case_file,"ReCref = %lf \n",&ReCref_);
    fscanf(case_file,"ClMax = %lf \n",&ClMax_);
    fscanf(case_file,"Symmetry = %s \n",SymmetryFlag);
    fscanf(case_file,"FarDist = %lf \n",&FarDist_);
    fscanf(case_file,"NumWakeNodes = %d \n",&NumberOfWakeNodes_);
    fscanf(case_file,"WakeIters = %d \n",&WakeIterations_);
    
    if ( FarDist_ > 0. ) SetFarDist_ = 1;
    
    if ( WakeIterations_ <= 0 ) WakeIterations_ = 1;

    printf("Sref         = %lf \n",Sref_);
    printf("Cref         = %lf \n",Cref_);
    printf("Bref         = %lf \n",Bref_);
    printf("X_cg         = %lf \n",Xcg_);
    printf("Y_cg         = %lf \n",Ycg_);
    printf("Z_cg         = %lf \n",Zcg_);
    printf("Mach         = %lf \n",Mach_);
    printf("AoA          = %lf \n",AoA_);
    printf("Beta         = %lf \n",Beta_);
    printf("Vinf         = %lf \n",Vinf_);
    printf("Rho          = %lf \n",Rho_);
    printf("ReCref       = %lf \n",ReCref_);
    printf("ClMax        = %lf \n",ClMax_);
    printf("Symmetry     = %s  \n",SymmetryFlag);
    printf("FarDist      = %lf \n",FarDist_);
    printf("NumWakeNodes = %d  \n",NumberOfWakeNodes_);
    printf("WakeIters    = %d  \n",WakeIterations_);

    VSP_VLM().Sref() = Sref_;
    VSP_VLM().Cref() = Cref_;
    VSP_VLM().Bref() = Bref_;

    VSP_VLM().Xcg() = Xcg_;
    VSP_VLM().Ycg() = Ycg_;
    VSP_VLM().Zcg() = Zcg_;
    
    VSP_VLM().Mach() = Mach_;
    VSP_VLM().AngleOfAttack() = AoA_ * TORAD;
    VSP_VLM().AngleOfBeta() = Beta_ * TORAD;
    
    VSP_VLM().Vinf() = Vinf_;
    
    VSP_VLM().Density() = Rho_;
    
    VSP_VLM().ReCref() = ReCref_;
    
    VSP_VLM().ClMax() = ClMax_;
    
    VSP_VLM().WakeIterations() = WakeIterations_;
    
    VSP_VLM().RotationalRate_p() = 0.0;
    VSP_VLM().RotationalRate_q() = 0.0;
    VSP_VLM().RotationalRate_r() = 0.0;    
    
    if ( strcmp(SymmetryFlag,"X") == 0 ) DoSymmetry_ = SYM_X;
    if ( strcmp(SymmetryFlag,"Y") == 0 ) DoSymmetry_ = SYM_Y;
    if ( strcmp(SymmetryFlag,"Z") == 0 ) DoSymmetry_ = SYM_Z;
        
    // Load in the rotor data
    
    NumberOfRotors_ = 0;
    
    fscanf(case_file,"NumberOfRotors = %d \n",&NumberOfRotors_);
    
    printf("NumberOfRotors: %d \n",NumberOfRotors_);
    
    VSP_VLM().SetNumberOfRotors(NumberOfRotors_);
    
    for ( i = 1 ; i <= NumberOfRotors_ ; i++ ) {
     
       fgets(DumChar,200,case_file);
       fgets(DumChar,200,case_file);
       
       printf("\nLoading data for rotor: %5d \n",i);
       
       VSP_VLM().RotorDisk(i).Load_STP_Data(case_file);
       
    }
    
    fclose(case_file);
    
}