From 50670d87e45db674d32ff95a1abaa25e299eae91 Mon Sep 17 00:00:00 2001 From: acrovato <a.crovato@uliege.be> Date: Wed, 8 Mar 2023 11:39:51 +0100 Subject: [PATCH] Remove speed of sound. Add output. Refactor names. --- sdpm/src/sdpmProblem.cpp | 3 +- sdpm/src/sdpmProblem.h | 12 ++--- sdpm/src/sdpmSolver.cpp | 110 +++++++++++++++++++++++++++++---------- 3 files changed, 88 insertions(+), 37 deletions(-) diff --git a/sdpm/src/sdpmProblem.cpp b/sdpm/src/sdpmProblem.cpp index 50fcb8f..fe7db83 100644 --- a/sdpm/src/sdpmProblem.cpp +++ b/sdpm/src/sdpmProblem.cpp @@ -22,7 +22,7 @@ using namespace sdpm; Problem::Problem(Mesh &msh, size_t nmods, std::vector<double> const &fs) : _msh(msh), - _aoa(0.), _aos(0.), _mach(0.), _beta(1.0), _sound(0.), _uinf(sdpmVector3d::Zero()), + _aoa(0.), _aos(0.), _mach(0.), _beta(1.0), _uinf(sdpmVector3d::Zero()), _dDir(sdpmVector3d::Zero()), _sDir(sdpmVector3d::Zero()), _lDir(sdpmVector3d::Zero()), _sRef(0.), _cRef(0.), _xRef(sdpmVector3d::Zero()), _ySym(false), _nModes(nmods), _omega(fs), @@ -54,7 +54,6 @@ void Problem::updateFreestream(double aoa, double aos, double mch, double ui) // Compressiblity _mach = mch; _beta = std::sqrt(1 - _mach * _mach); - _sound = ui / _mach; // Velocity and directions _uinf = ui * sdpmVector3d(cos(_aoa) * cos(_aos), sin(_aos), sin(_aoa) * cos(_aos)); _dDir = sdpmVector3d(cos(_aoa) * cos(_aos), sin(_aos), sin(_aoa) * cos(_aos)); diff --git a/sdpm/src/sdpmProblem.h b/sdpm/src/sdpmProblem.h index bee2d6f..a6bcbaa 100644 --- a/sdpm/src/sdpmProblem.h +++ b/sdpm/src/sdpmProblem.h @@ -39,7 +39,6 @@ class SDPM_API Problem : public sdpmObject sdpmDouble _aos; ///< Angle of sideslip sdpmDouble _mach; ///< Mach number sdpmDouble _beta; ///< Compressibility factor - sdpmDouble _sound; ///< Speed of sound sdpmVector3d _uinf; ///< Freestream velocity sdpmVector3d _dDir; ///< Direction of drag force sdpmVector3d _sDir; ///< Direction of side force @@ -71,17 +70,16 @@ public: sdpmDouble getAos() const { return _aos; } sdpmDouble getMach() const { return _mach; } sdpmDouble getCompressibility() const { return _beta; } - sdpmDouble getSpeedOfSound() const { return _sound; } + sdpmVector3d const &getVelocity() const { return _uinf; } + sdpmVector3d const &getDragDir() const { return _dDir; } + sdpmVector3d const &getSideDir() const { return _sDir; } + sdpmVector3d const &getLiftDir() const { return _lDir; } sdpmDouble getRefArea() const { return _sRef; } sdpmDouble getRefLgth() const { return _cRef; } sdpmVector3d const &getRefCtr() const { return _xRef; } sdpmDouble getSym() const { return _ySym; } - std::vector<double> const &getFreqs() const { return _omega; } size_t getNumModes() const { return _nModes; } - sdpmVector3d const &getFrstrmVel() const { return _uinf; } - sdpmVector3d const &getDragDir() const { return _dDir; } - sdpmVector3d const &getSideDir() const { return _sDir; } - sdpmVector3d const &getLiftDir() const { return _lDir; } + std::vector<double> const &getFrequencies() const { return _omega; } #endif void addBody(Body &b); void updateFreestream(double aoa, double aos, double mch, double ui); diff --git a/sdpm/src/sdpmSolver.cpp b/sdpm/src/sdpmSolver.cpp index e830ff1..5e0e1eb 100644 --- a/sdpm/src/sdpmSolver.cpp +++ b/sdpm/src/sdpmSolver.cpp @@ -52,7 +52,7 @@ Solver::Solver(Problem &pbl) : _pbl(pbl), _cl(0), _cd(0), _cs(0), _cm(0) // Get sizes size_t nm = _pbl.getNumModes(); - size_t nf = _pbl.getFreqs().size(); + size_t nf = _pbl.getFrequencies().size(); size_t ne = _pbl.getElements().size(); // Resize AIC matrics @@ -84,13 +84,13 @@ Solver::Solver(Problem &pbl) : _pbl(pbl), _cl(0), _cd(0), _cs(0), _cm(0) << "Angle of attack: " << _pbl.getAoa() * 180 / 3.14159 << " deg\n" << "Angle of sideslip: " << _pbl.getAos() * 180 / 3.14159 << " deg\n" << "Mach number: " << _pbl.getMach() << "\n" - << "Velocity: " << _pbl.getFrstrmVel().norm() << "\n"; + << "Velocity: " << _pbl.getVelocity().norm() << "\n"; std::cout << "--- Reference data ---\n" << "Surface area: " << _pbl.getRefArea() << "\n" << "Chord length: " << _pbl.getRefLgth() << "\n" << "Origin: (" << _pbl.getRefCtr().transpose() << ")\n"; std::cout << "--- Unsteady parameters ---\n" - << "Number of frequencies: " << _pbl.getFreqs().size() << "\n" + << "Number of frequencies: " << _pbl.getFrequencies().size() << "\n" << "Number of motions: " << _pbl.getNumModes() << "\n" << std::endl; } @@ -107,9 +107,9 @@ void Solver::update() { // Update elements and get values _pbl.updateElements(); - std::vector<double> omega = _pbl.getFreqs(); - sdpmDouble mach = _pbl.getMach(); - sdpmDouble sound = _pbl.getSpeedOfSound(); + std::vector<double> omega = _pbl.getFrequencies(); + sdpmDouble ui = _pbl.getVelocity().norm(); + sdpmDouble mi = _pbl.getMach(); sdpmDouble beta = _pbl.getCompressibility(); sdpmComplex img(0, 1); @@ -137,10 +137,10 @@ void Solver::update() _B0(_rows.at(ei), _rows.at(ej)) = mutau[1]; for (size_t fk = 0; fk < omega.size(); ++fk) { - sdpmDouble om = omega[fk] / sound / beta; + sdpmDouble om = omega[fk] * mi / ui / beta; sdpmVector3d r = Builder::computeDistVec(false, ei, ej); - sdpmComplex exp = std::exp(-img * om * (r.norm() - mach * r(0))); - _A[fk](_rows.at(ei), _rows.at(ej)) = (mutau[0] * (1. + img * om * r.norm()) - mutau[1] * img * om * mach * nx) * exp; + sdpmComplex exp = std::exp(-img * om * (r.norm() - mi * r(0))); + _A[fk](_rows.at(ei), _rows.at(ej)) = (mutau[0] * (1. + img * om * r.norm()) - mutau[1] * img * om * mi * nx) * exp; _B[fk](_rows.at(ei), _rows.at(ej)) = mutau[1] * exp; } } @@ -163,9 +163,9 @@ void Solver::update() _A0(_rows.at(ei), _rows.at(wwMap.at(ew).second)) -= mutau[0]; for (size_t fk = 0; fk < omega.size(); ++fk) { - sdpmDouble om = omega[fk] / sound / beta; + sdpmDouble om = omega[fk] * mi / ui / beta; sdpmVector3d r = Builder::computeDistVec(false, ei, ew); - sdpmComplex exp = std::exp(-img * om * (r.norm() - mach * r(0))); + sdpmComplex exp = std::exp(-img * om * (r.norm() - mi * r(0))); sdpmComplex waktrm = mutau[0] * (1. + img * om * r.norm()) * exp * std::exp(-img * omega[fk] * lagMap.at(ew)); _A[fk](_rows.at(ei), _rows.at(wwMap.at(ew).first)) += waktrm; _A[fk](_rows.at(ei), _rows.at(wwMap.at(ew).second)) -= waktrm; @@ -194,10 +194,10 @@ void Solver::update() _B0(_rows.at(ei), _rows.at(ej)) -= mutau[1]; for (size_t fk = 0; fk < omega.size(); ++fk) { - sdpmDouble om = omega[fk] / sound / beta; + sdpmDouble om = omega[fk] * mi / ui / beta; sdpmVector3d r = Builder::computeDistVec(true, ei, ej); - sdpmComplex exp = std::exp(-img * om * (r.norm() - mach * r(0))); - _A[fk](_rows.at(ei), _rows.at(ej)) -= (mutau[0] * (1. + img * om * r.norm()) - mutau[1] * img * om * mach * nx) * exp; + sdpmComplex exp = std::exp(-img * om * (r.norm() - mi * r(0))); + _A[fk](_rows.at(ei), _rows.at(ej)) -= (mutau[0] * (1. + img * om * r.norm()) - mutau[1] * img * om * mi * nx) * exp; _B[fk](_rows.at(ei), _rows.at(ej)) -= mutau[1] * exp; } } @@ -220,9 +220,9 @@ void Solver::update() _A0(_rows.at(ei), _rows.at(wwMap.at(ew).second)) += mutau[0]; for (size_t fk = 0; fk < omega.size(); ++fk) { - sdpmDouble om = omega[fk] / sound / beta; + sdpmDouble om = omega[fk] * mi / ui / beta; sdpmVector3d r = Builder::computeDistVec(true, ei, ew); - sdpmComplex exp = std::exp(-img * om * (r.norm() - mach * r(0))); + sdpmComplex exp = std::exp(-img * om * (r.norm() - mi * r(0))); sdpmComplex waktrm = mutau[0] * (1. + img * om * r.norm()) * exp * std::exp(-img * omega[fk] * lagMap.at(ew)); _A[fk](_rows.at(ei), _rows.at(wwMap.at(ew).first)) -= waktrm; _A[fk](_rows.at(ei), _rows.at(wwMap.at(ew).second)) += waktrm; @@ -242,7 +242,7 @@ void Solver::run() { std::cout << "Running steady SDPM solver... " << std::endl; std::cout << "computing sources... " << std::flush; - sdpmVector3d ui = _pbl.getFrstrmVel(); // freestream velocity + sdpmVector3d ui = _pbl.getVelocity(); // freestream velocity sdpmVectorXd etau(_nP); for (auto body : _pbl.getBodies()) for (auto e : body->getElements()) @@ -273,7 +273,7 @@ void Solver::runUnsteady() for (auto body : _pbl.getBodies()) body->computeVelocity(imd); // Solve - for (size_t ifq = 0; ifq < _pbl.getFreqs().size(); ++ifq) + for (size_t ifq = 0; ifq < _pbl.getFrequencies().size(); ++ifq) { std::cout << "Mode #" << imd << ", frequency #" << ifq << std::endl; std::cout << "computing sources... " << std::flush; @@ -284,7 +284,7 @@ void Solver::runUnsteady() std::vector<sdpmVector3cd> uc1 = body->getHarmonicVelocity(imd); std::vector<Element *> elems = body->getElements(); for (size_t i = 0; i < elems.size(); ++i) - etau(_rows[elems[i]]) = (uc0[i] + uc1[i] * sdpmComplex(0., 1.) * _pbl.getFreqs()[ifq]).conjugate().dot(elems[i]->getCompressibleNormal().cwiseQuotient(sdpmVector3d(_pbl.getCompressibility(), 1., 1.))); + etau(_rows[elems[i]]) = (uc0[i] + uc1[i] * sdpmComplex(0., 1.) * _pbl.getFrequencies()[ifq]).conjugate().dot(elems[i]->getCompressibleNormal().cwiseQuotient(sdpmVector3d(_pbl.getCompressibility(), 1., 1.))); } std::cout << "done." << std::endl; @@ -306,15 +306,52 @@ void Solver::runUnsteady() */ void Solver::save(GmshExport const &writer, std::string const &suffix) { + // Get data + size_t nE = _pbl.getElements().size(); + size_t nM = _pbl.getNumModes(); + std::vector<sdpmDouble> omega = _pbl.getFrequencies(); + size_t nF = omega.size(); + sdpmDouble toDeg = 180. / 3.14159; + // Write files std::cout << "Saving files... " << std::endl; // set up results Results results; + // steady results.scalarsAtElems["phi"] = &_phi; results.scalarsAtElems["mu"] = &_mu; results.scalarsAtElems["tau"] = &_tau; results.vectorsAtElems["u"] = &_u; results.scalarsAtElems["cp"] = &_cp; + // unsteady + std::vector<std::vector<std::vector<sdpmVector3d>>> u1_abs(nM, std::vector<std::vector<sdpmVector3d>>(nF, std::vector<sdpmVector3d>(nE))); + std::vector<std::vector<std::vector<sdpmVector3d>>> u1_arg(nM, std::vector<std::vector<sdpmVector3d>>(nF, std::vector<sdpmVector3d>(nE))); + std::vector<std::vector<std::vector<sdpmDouble>>> cp1_abs(nM, std::vector<std::vector<sdpmDouble>>(nF, std::vector<sdpmDouble>(nE))); + std::vector<std::vector<std::vector<sdpmDouble>>> cp1_arg(nM, std::vector<std::vector<sdpmDouble>>(nF, std::vector<sdpmDouble>(nE))); + for (size_t imd = 0; imd < nM; ++imd) + { + for (size_t ifq = 0; ifq < nF; ++ifq) + { + // set names + std::stringstream u1_abs_name, u1_arg_name, cp1_abs_name, cp1_arg_name; + u1_abs_name << "|u1|_" << imd << "_" << ifq; + u1_arg_name << "< u1_" << imd << "_" << ifq; + cp1_abs_name << "|cp1|_" << imd << "_" << ifq; + cp1_arg_name << "< cp1_" << imd << "_" << ifq; + // set values + for (size_t i = 0; i < nE; ++i) + { + u1_abs[imd][ifq][i] = _u1[imd][ifq][i].array().abs(); + u1_arg[imd][ifq][i] = _u1[imd][ifq][i].array().arg() * toDeg; + cp1_abs[imd][ifq][i] = std::abs(_cp1[imd][ifq][i]); + cp1_arg[imd][ifq][i] = std::arg(_cp1[imd][ifq][i]) * toDeg; + } + results.vectorsAtElems[u1_abs_name.str()] = &u1_abs[imd][ifq]; + results.vectorsAtElems[u1_arg_name.str()] = &u1_arg[imd][ifq]; + results.scalarsAtElems[cp1_abs_name.str()] = &cp1_abs[imd][ifq]; + results.scalarsAtElems[cp1_arg_name.str()] = &cp1_arg[imd][ifq]; + } + } // save results writer.save(results, suffix); // save aerodynamic loads breakdown @@ -323,13 +360,29 @@ void Solver::save(GmshExport const &writer, std::string const &suffix) outfile.open("aeroloads_breakdown.dat"); for (auto b : _pbl.getBodies()) { + // steady outfile << "# Body - " << b->getName() << " (" << b->getElements().size() << " elements)" << std::endl; outfile << std::fixed << std::setprecision(5) << "Cl = " << b->getLiftCoeff() << "\n" << "Cd = " << b->getDragCoeff() << "\n" << "Cs = " << b->getSideforceCoeff() << "\n" - << "Cm = " << b->getMomentCoeff() << std::endl - << std::endl; + << "Cm = " << b->getMomentCoeff() << "\n"; + // unsteady + for (size_t imd = 0; imd < nM; ++imd) + { + for (size_t ifq = 0; ifq < nF; ++ifq) + { + outfile << "|Cl1| (mode #" << imd << ", omega=" << omega[ifq] << ") = " << std::abs(b->getUnsteadyLiftCoeff(imd, ifq)) << "\n" + << "< Cl1 (mode #" << imd << ", omega=" << omega[ifq] << ") = " << std::arg(b->getUnsteadyLiftCoeff(imd, ifq)) * toDeg << "\n" + << "|Cd1| (mode #" << imd << ", omega=" << omega[ifq] << ") = " << std::abs(b->getUnsteadyDragCoeff(imd, ifq)) << "\n" + << "< Cd1 (mode #" << imd << ", omega=" << omega[ifq] << ") = " << std::arg(b->getUnsteadyDragCoeff(imd, ifq)) * toDeg << "\n" + << "|Cs1| (mode #" << imd << ", omega=" << omega[ifq] << ") = " << std::abs(b->getUnsteadySideforceCoeff(imd, ifq)) << "\n" + << "< Cs1 (mode #" << imd << ", omega=" << omega[ifq] << ") = " << std::arg(b->getUnsteadySideforceCoeff(imd, ifq)) * toDeg << "\n" + << "|Cm1| (mode #" << imd << ", omega=" << omega[ifq] << ") = " << std::abs(b->getUnsteadyMomentCoeff(imd, ifq)) << "\n" + << "< Cm1 (mode #" << imd << ", omega=" << omega[ifq] << ") = " << std::arg(b->getUnsteadyMomentCoeff(imd, ifq)) * toDeg << "\n" + << std::endl; + } + } } outfile.close(); std::cout << "done." << std::endl; @@ -366,8 +419,8 @@ void Solver::post(sdpmVectorXd const &etau, sdpmVectorXd const &emu) } // Compute surface flow functionals - sdpmVector3d ui = _pbl.getFrstrmVel(); // freestream velocity - sdpmDouble mi = _pbl.getMach(); // freestream speed of sound + sdpmVector3d ui = _pbl.getVelocity(); // freestream velocity + sdpmDouble mi = _pbl.getMach(); // freestream speed of sound for (auto body : bodies) { for (auto e : body->getElements()) @@ -446,13 +499,14 @@ void Solver::postUnsteady(size_t imd, size_t ifq, sdpmVectorXcd const &etau, sdp } // Compute flow and loads - sdpmVector3d ui = _pbl.getFrstrmVel(); - double omega = _pbl.getFreqs()[ifq]; + sdpmVector3d ui = _pbl.getVelocity(); + sdpmDouble mi = _pbl.getMach(); + sdpmDouble omega = _pbl.getFrequencies()[ifq]; sdpmDouble sRef = _pbl.getRefArea(); sdpmDouble cRef = _pbl.getRefLgth(); sdpmVector3d xRef = _pbl.getRefCtr(); - double ca = cos(_pbl.getAos()); - double sa = sin(_pbl.getAos()); + sdpmDouble ca = cos(_pbl.getAos()); + sdpmDouble sa = sin(_pbl.getAos()); _cl1[imd][ifq] = sdpmComplex(0., 0.); _cd1[imd][ifq] = sdpmComplex(0., 0.); _cs1[imd][ifq] = sdpmComplex(0., 0.); @@ -480,7 +534,7 @@ void Solver::postUnsteady(size_t imd, size_t ifq, sdpmVectorXcd const &etau, sdp // ecp = -2 / u_inf^2 * si + 1/u_inf^2/a_inf^2 * conv(si, si) sdpmVectorXcd ecp(9); ecp << 0., 0., -2 * si / ui.dot(ui), 0., 0.; - ecp += convolve(si, si) / (_pbl.getSpeedOfSound() * _pbl.getSpeedOfSound() * ui.dot(ui)); + ecp += convolve(si, si) * mi * mi / (ui.dot(ui) * ui.dot(ui)); for (size_t u = 0; u < 3; ++u) cp012[i][u] = ecp(4 + u); _cp1[imd][ifq][elems[i]->getId() - 1] = cp012[i][1]; -- GitLab