Informatique Scientifique en C++

support de cours/TD (2010-2011)

F. Hecht, I. Danaila


Semaine 10

Cours

mardi 08/03/2011 (ID) : Différentiation automatique (DA) :: voir chap7 de Notes de cours 
  • Principe de la méthode. Calcul automatique des dérivées.
  • Mise en oeuvre : fonction d'une seule ou plusieurs variables.
  • La classe ddouble pour la DA en C++ (ddouble.hpp).
 
  
vendredi 11/03/2011 (FH):Introduction à OpenGL


TD ::

Indications supplémentaires pour l'écriture des programmes C++

 

  1. Utiliser comme point de départ le programme EF2d-2011.cpp  de l'archive semaine_07.tar.gz
     
  2. Quelques points particuliers à surveiller

     

    • Le vecteur résultat du produit matrice-vecteur (fonction addMatMul) est assemblé seulement pour les points du maillage qui n'appartiennent pas aux frontières avec des conditions de Dirichlet ; c'est la partie

      if( ! K[i].onGamma() ) Ax[ig] += M_K[i][j] * x[jg];

      Attention,

      • pour les questions Q2a et Q2b nous n'avons pas des conditions de Dirichlet 
      • pour la question Q2c on impose des conditions de Dirichlet seulement à une partie de la frontière (Gamma_4).

     

    • La visualisation des résultats se fait avec Gnuplot (analyser l'écriture du fichier plot) dans le programme EF2d-2011.cpp

      splot "plot" using 1:2:3 w l
       

    • Utiliser aussi la fonction suivante (gnuplot-iso.hpp) pour tracer les lignes de niveau (comme sous FreeFem++)

     

    • Communication C++ --> FreeFem++ ; on va utiliser les résultats générés par le programme C++ et les lire dans le script FreeFem++
      1. on va d'abord écrire la solution C++ dans un fichier (x.sol) ; bien entendu, x est  un KN<R>
        {
        ofstream f("x.sol");
        f << x << endl;
        }

      2. on va lire ce fichier dans FreeFem++ et comparer les deux solutions
        •   fespace Vh(Th,P1); // espace P1
        •   Vh u ; // solution calculée par FreeFem++
        •   ....
        •   Vh ucpp; // solution C++
        •   ifstream ficcpp("x.sol") ; // lecture du fichier sauvergardé par C++
        •   ficcpp >> ucpp[ ] ;
        •   u = u - uccpp; // différence entre les deux solutions
        •   plot(u, cmm = "difference entre les deux solutions", value=1, wait=1);

        La différence entre la solution C++ et la solution FreeFem doit être 

        • ~ < 1.e-6  (si la précison démandée dans le grad conj est eps=1e-6).
        • ~ < 1.e-10  (si la précison démandée dans le grad conj est eps=1e-10).

         
    • (à faire) Communication FreeFem++ --> C++ :
      1. sauvegarder la solution FreeFem++ dans un fichier,
      2. lire cette solution dans C++,
      3. calculer la norme de la différence entre les deux solutions
      4. visualiser la solution FreeFem++ avec Gnuplot

       

       


Exemples de résultats obtenus avec les programmes C++

 

  1. (Question Q2b) Visualisation 3D de la solution et comparaison avec la solution FreeFem++ pour le même cas 
  2. (Question Q2b) Visualisation des lignes de niveau : plot_explicite_0.25_isos.pdf 
  3. (Question Q2b) (Communication C++ --> FreeFem++)