Bonsoir,
Je débute en C++ (d'habitude en java) et j'ai un problème, je suis sensé résoudre 2 équations d'advection en ayant leurs conditions initial et les conditions limites. On doit utiliser différent "scheme" (upwind explicit, upwind implicit, Lax-Wendroff et Richtmyer) et on nous donne aussi la solution analytique pour comparer avec les résultats, j'essaie déjà de résoudre avec upwind explicit et implicit mais je n'ai rien. Lorsque j'initialise avec les conditions limite et initial, j'obtiens bien mon vector 2D remplit mais lorsque j'applique le upwind scheme je n'ai rien dans mon second vector 2D. J'ai beau chercher, je ne trouve mon erreur .
Donc si une bonne âme veut bien m'aider, je ne dis pas non .
Les conditions:
2020-12-14 04_59_06-CompMethods_CPP_Assignment_2020.pdf - Personnel - Microsoft Edge.png
La solution analytique:
2020-12-14 04_59_23-CompMethods_CPP_Assignment_2020.pdf - Personnel - Microsoft Edge.png
Voici le code pour le SET1
Code:#include "set1.hpp" #include <iostream> #include <vector> #include <algorithm> #include <iterator> #include <cmath> #include <sstream> using namespace std; Set1::Set1(double xmin, double xmax, int nbr, double u, double dt, double tmax) { iDx = (xmax - xmin) / nbr; iNt = tmax / dt; iXmin = xmin; iXmax = xmax; iNbr = nbr; iU = u; iDt = dt; iTmax = tmax; } double Set1::getDx() const { return iDx; } int Set1::getNt() const { return iNt; } double Set1::getXmin() const { return iXmin; } double Set1::getXmax() const { return iXmax; } int Set1::getNbr() const { return iNbr; } double Set1::getU() const { return iU; } double Set1::getDt() const { return iDt; } double Set1::getTmax() const { return iTmax; } vector<vector<double>> Set1::intialization() { vector<vector<double>> v; double sum = iXmin + iDx; double xval; vector<double> n0(iNt, 0.0); vector<double> ne(iNt, 1.0); v.push_back(n0); for (int i = 1; i < iNbr - 1; i++) { vector<double>temp; for (int j = 0; j < iNt; j++) { if (sum - abs(sum) < 0) { xval = -(1.0 / 2.0); } else { xval = 1.0 / 2.0; } temp.push_back(xval); } sum += iDx; v.push_back(temp); } v.push_back(ne); return v; } //upwind explicit vector<vector<double>> Set1::upwinde(vector<vector<double>> v) { vector<vector<double>> ue; double xval; for (int i = 1; i < iNbr - 1; i++) { vector<double>temp; for (int j = 0; j < iNt; j++) { xval = v[i][j] - (iU * iDt / iDx) * (v[i][j] - v[i - 1][j]); temp.push_back(xval); } v.push_back(temp); } return ue; } //upwind implicit vector<vector<double>> Set1::upwindi(vector<vector<double>> v) { vector<vector<double>> ue; double xval; for (int i = 1; i < iNbr - 1; i++) { vector<double>temp; for (int j = 0; j < iNt-1; j++) { xval = v[i][j] - (iU * iDt / iDx) * (v[i][j+1] - v[i - 1][j+1]); temp.push_back(xval); } v.push_back(temp); } return ue; } //Lax-Wendroff //Richtmyer //Analytical solution vector<vector<double>> Set1::analytical() { vector<vector<double>> ue; double sum = iXmin; double time = 0.0; double xval; for (int i = 0; i < iNbr; i++) { vector<double>temp; for (int j = 0; j < iNt; j++) { if ((sum - 1.75*time) < 0) { xval = -0.5; } else { xval = 0.5; } temp.push_back(xval); time += iDt; } sum += iDx; ue.push_back(temp); } return ue; } //display the value of 2D vectors void Set1::show2DVec(vector<vector<double>> vec) { cout << "initial \n"; for (size_t k = 0; k < vec.size(); k = k + 1) { for (size_t l = 0; l < vec[k].size(); l = l + 1) { cout << vec[k][l] << ' '; } cout << endl; } cout << "\n"; }
-----