diff --git a/include/Aerodynamics.hpp b/include/Aerodynamics.hpp new file mode 100644 index 0000000..d52f0d5 --- /dev/null +++ b/include/Aerodynamics.hpp @@ -0,0 +1,35 @@ +#pragma once +#include "IAerodynamics.hpp" +#include "State.hpp" +#include +#include +#include +using namespace std; + +class DragFromFile : public IAerodynamics { +private: + vector mach; + vector cd; + double MaxMach = 0.0; + double MinMach = 0.0; + + void readTable(const string& filename); + + double interpolateCD(double MachInput) const; + +public: + + DragFromFile(); + + explicit DragFromFile(const string& filename); + + double GetmaxMach() const; + + double GetminMach() const; + + double GetCd(const State& aerodynamicState) const override; + + double getCdFromMach(double mach) const; + + Eigen::Vector3d GetMomentCoefficients(const State& aerodynamicState) const override; +}; diff --git a/main.cpp b/main.cpp index 379d14a..4cacbc0 100644 --- a/main.cpp +++ b/main.cpp @@ -1,4 +1,37 @@ +#include "Aerodynamics.hpp" +#include "State.hpp" +#include +#include +#include +#include +using namespace std; int main() { + string input = " "; + double MachInput = 0.0; + + DragFromFile aero("cd.csv"); + double MinMach = aero.GetminMach(); + double MaxMach = aero.GetmaxMach(); + + try{ + cout << "enter a Mach Number(" << MinMach << "<= M <=" << MaxMach << "): "; + getline(cin, input); + MachInput = stod(input); + if (MachInput < 0.00 || MachInput > 3.00) throw logic_error (" Value of Mach number should be in the range"); + } + catch(const exception& e) + { + cout << "Error in the input" << e.what() << endl; + return 1; + } + + State state(1); + state[0] = MachInput; + + double cd = aero.GetCd(state); + + cout << fixed << setprecision(5); + cout << "Drag coefficient: " << cd << endl; return 0; -} \ No newline at end of file +} diff --git a/src/aerodynamics/DragFromFile.cpp b/src/aerodynamics/DragFromFile.cpp new file mode 100644 index 0000000..b80bf2f --- /dev/null +++ b/src/aerodynamics/DragFromFile.cpp @@ -0,0 +1,98 @@ +#include "Aerodynamics.hpp" +#include +#include +#include +#include +#include +#include +using namespace std; + +DragFromFile::DragFromFile() = default; + +DragFromFile::DragFromFile(const string& filename) +{ + readTable(filename); +} + +void DragFromFile::readTable(const string& filename) +{ + ifstream vMyFile(filename); + if (!vMyFile.good()) + { + throw runtime_error("Failed to open file: " + filename); + return; + } + + mach.clear(); + cd.clear(); + + double Mach_data; + double Cd_data; + char comma; + + while (vMyFile >> Mach_data >> comma >> Cd_data) + { + mach.push_back(Mach_data); + cd.push_back(Cd_data); + } + + auto range = minmax_element(mach.begin(), mach.end()); + MinMach = *range.first; + MaxMach = *range.second; + vMyFile.close(); +} + +double DragFromFile::interpolateCD(double MachInput) const +{ + if (mach.empty()) return 0.0; + + for (size_t i = 0; i < mach.size() - 1; i++) + { + if (MachInput >= mach[i] && MachInput <= mach[i+1]) + { + return cd[i] + (cd[i+1] - cd[i]) * (MachInput - mach[i]) / (mach[i+1] - mach[i]); + } + } + + return cd.back(); +} + +double DragFromFile::GetmaxMach() const +{ + return MaxMach; +} + + +double DragFromFile::GetminMach() const +{ + return MinMach; +} + +double DragFromFile::GetCd(const State& aerodynamicState) const +{ + if (aerodynamicState.size() > 0) + { + double mach = aerodynamicState[0]; + if (mach >= MinMach && mach <= MaxMach) + { + return interpolateCD(mach); + } + else + { + throw out_of_range("Mach number out of range."); + } + } + + throw std::invalid_argument("State is empty"); +} + +double DragFromFile::getCdFromMach(double mach) const +{ + return interpolateCD(mach); +} + + +Eigen::Vector3d DragFromFile::GetMomentCoefficients(const State&) const +{ + return Eigen::Vector3d::Zero(); +}