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(); }
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); }
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"); }
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); }
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); }