C++ pour résolution d'équation d'advection - vectors 2D pas d'affichage
Répondre à la discussion
Affichage des résultats 1 à 5 sur 5

C++ pour résolution d'équation d'advection - vectors 2D pas d'affichage



  1. #1
    theflowhd

    C++ pour résolution d'équation d'advection - vectors 2D pas d'affichage


    ------

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

    -----

  2. #2
    Jack
    Modérateur

    Re : C++ pour résolution d'équation d'advection - vectors 2D pas d'affichage

    Dans les fonctions membre upwindi et upwinde tu déclares un vecteur local ue que tu retournes sans l'avoir modifié. Tes fonctions retournent donc systématiquement un vecteur vide.

  3. #3
    pm42

    Re : C++ pour résolution d'équation d'advection - vectors 2D pas d'affichage

    Citation Envoyé par Jack Voir le message
    Dans les fonctions membre upwindi et upwinde tu déclares un vecteur local ue que tu retournes sans l'avoir modifié. Tes fonctions retournent donc systématiquement un vecteur vide.
    Bien vu. Il modifie le vecteur v passé en argument à la place en effet.

  4. #4
    Jack
    Modérateur

    Re : C++ pour résolution d'équation d'advection - vectors 2D pas d'affichage

    Puisque theflowhd est débutant en C++, je vais lui donner un petit conseil qu'il applique peut-être sans le savoir en Java: on ne doit passer en paramètre que des variables de type simple (entier, flottant, caractère; booléen, etc.). Si on veut passer autre chose, on passe le paramètre par référence. En Java ou en C# c'est fait automatiquement, mais pas en C++.

    En passant v par référence, toutes les modifications apportées à v dans la fonction se répercuteront sur la variable de la fonction appelante. Du coup, la fonction peut éventuellement ne plus avoir besoin de retourner un résultat, ça dépend de ce que tu veux faire dans la fonction appelante.

    Il est également possible de retourner une référence, ce qui peut permettre d'effectuer l'appel de la fonction dans la partie gauche d'une affectation (à gauche du =).

  5. A voir en vidéo sur Futura
  6. #5
    theflowhd

    Re : C++ pour résolution d'équation d'advection - vectors 2D pas d'affichage

    Merci Jack !
    Et merci aussi pour l'info, je vais plus m'informer sur les références pour mettre ça en place (effectivement en java c'est fait automatiquement).

Discussions similaires

  1. Résoudre l'équation d'advection avec terme source par volumes finis
    Par turbulent dans le forum Programmation et langages, Algorithmique
    Réponses: 1
    Dernier message: 19/11/2012, 11h19
  2. résolution d'une équation pour un dm...
    Par invite8bc30014 dans le forum Mathématiques du collège et du lycée
    Réponses: 2
    Dernier message: 08/10/2009, 18h12
  3. Equation d'advection
    Par invite3799b2e8 dans le forum Physique
    Réponses: 0
    Dernier message: 15/09/2007, 16h48
  4. Pb pour la resolution d'un système d'équation non linéaire
    Par invite38685413 dans le forum Mathématiques du supérieur
    Réponses: 2
    Dernier message: 04/08/2006, 10h30
  5. logiciel pour resolution d'une équation non-linéaire
    Par bob_isat dans le forum Logiciel - Software - Open Source
    Réponses: 8
    Dernier message: 10/03/2006, 18h41