Informatique Scientifique en C++

support de cours/TD (2010-2011)

F. Hecht, I. Danaila


Semaine 5

Cours

mardi 01/02/2011 (ID) :
  • Héritage : principe, syntaxe, exemples. Appel des constructeurs, pointeur vers la classe de base.
  • Fonctions virtuelles dans une classe dérivée. Appel des méthodes virtuelle par rapport au type de pointeur.
  • voir l'exercice 1 plus bas.
 
  
vendredi 04/02/2011 (FH)


TD

Projet 1 :  nouvel énoncé du projet (fichier pdf)  : la question Q4 ne demande plus l'utilisation d'une méthode itérative pour la résolution du système linéaire.

 

Nouvelles indications pour la réalisation du projet :

Rapport :

Le rapport doit être rédigé en LateX et doit inclure (sous forme de figures) les graphes illustrant les résultats obtenus. Il n'est pas nécessaire d'inclure dans le texte les programmes C++.
 
 Comment utiliser LateX pour rédiger un rapport
Pour vous aider : le fichier source de l'énoncé du projet projet1_2011.tex.
 
Comment générer des figures (fichiers pdf) à partir des graphes tracés sous Gnuplot
 
 

Programmes C++ :

  Mettez les schémas numériques sous forme matricielle pour pouvoir utiliser la classe (MatTriDiag.hpp et MatTriDiag.cpp) écrite  pour modéliser les matrices tridiagonales.
 
  Pour avancer la solution en temps, nous avons besoin de trois vecteurs seulement
U0[j] pour U^{n-1}_j, U1[j] pour U^{n}_j et  U2[j] pour U^{n+1}_j
 
Ces vecteurs seront actualisés à chaque nouveau pas de temps : on calcule toutes les composantes de U2 suivant la formule (8), ensuite on fait le "transfert"  U0 = U1, U1 = U2 et on continue avec un nouveau pas de temps.
 
Si nécessaire, les valeurs de la solution U2 correspondant à un instant de temps donné seront sauvegardées dans un fichier.
 
 
  Sauvegardez  la solution numérique pour plusieurs instants de temps sur la période T : par exemple,  t=0, T/4, 3T/4,  T.  Vous avez deux possibilités:
  • Utilisez des fichiers différents, dont le nom est généré suivant l'exemple du  ex_caracteres.cpp.
  • Utilisez le même fichier pour écrire la solution pour plusieurs instants de temps
    1. Dans la boucle en temps on peut écrire dans fics (défini comme ofstream avant cette boucle)

      for(int i=0;i<N;i++)
      fics << x[i] <<" " << temps <<" "<< U2[i] << endl;

      fics<<endl<<endl;
       // deux lignes vides pour indiquer à Gnuplot qu'une nouvelle courbe sera tracée

       
      Si le fichier contenant la solution est "res.dat", on peut utiliser les commandes Gnuplot

      plot "res.dat" u 1:3 w l

      splot "res.dat" w l

      Si l'on veut tracer seulement quelques courbes, on utilisera l'option index ;
      par exemple, pour tracer les courbes de 0 à 50 par pas de 10, on utilise les commandes Gnuplot suivantes

      plot "res.dat" u 1:3 index 0:50:10 title "sol numerique" w l
      splot "res.dat" u 1:2:3 index 0:50:10 title "sol numerique" w l
       

       
    2. Sur les graphs tracés précédemment, il faut superposer la solution  numérique  et la solution exacte (question Q2) pour plusieurs instants de temps.
    3.  
       
    4. Si l'on veut sauvegarder dans le fichier résultat "toutes les 10 courbes", par exemple, utiliser l'opérateur "modulo" % (nt compte le  nombre de pas de temps)

      if(nt %10 == 0){ for(int i=0;i<N;i++)
      fics << x[i] <<" " << temps <<" "<< u[i] << endl;

      fics<<endl<<endl;}

     

 
 

 

Exercice 1 : héritage et méthodes virtuelles

  1. Télécharger les programmes ClassAB.cpp et ClassABC.cpp
  2. (ClassAB.cpp) Analyser l'appel des constructeurs dans les classes dérivées par rapport au type de pointeur.
     
  3. (ClassABC.cpp) Analyser l'appel des méthodes virtuelles. Quel est le résultat sans la définition des méthodes comme virtuelles ?