*  Enseignements / Ing. Macs 2 / 2019-2020

        * Partiels
        * Langage C, le retour
        * C++ Wrapper in C
        * matwrapper
        * octwrapper
        * SLAC: version 0
        * SLAC: version 1
        * SLAC: version 2
        * Priorité des opérateurs (ajouté le 17/10/2019)
        * TP dérivation numérique (ajouté le 17/10/2019)
        * TP EDP 1D Stationnaire (ajouté le ??/10/2019)
        * TP Equation de la chaleur 1D en espace (ajouté le 20/11/2019)

pict pict

Cette année, deux groupes avec des thèmes/objectifs différents sont proposés pour les TPs EDPs.

Les étudiants sont répartis de la manière suivante:

Le Groupe Algorithmique fera l’ensemble des TPs de l’année 2018-2019.

*  Partiels



TP controle 1 31 octobre 2019, 8h30-11h30.



TP controle 2 12 décembre 2019, 8h30-11h30 (annulé).



TP Examen 6 janvier 2020, 13h45-16h45 (reporté au 13 janvier 2020, 13h45-16h45 ?) TP C/EDP : pict (410 Ko) , TP Algo/EDP : pict (324 Ko)



TP Rattrapage 9 mars 2020, 10h00-12h30.



La suite de cette page ne concerne que le Groupe Langage C.

*  Langage C, le retour



Sujet PDF Codes/Documents fournis



TD 1, fonctions, structures et allocation dynamique pict (376 Ko) pict (1000 bytes)



Les fonctions (présentation) pict (309 Ko) pict (316 bytes)



Les pointeurs (présentation) pict (534 Ko) pict (495 bytes)



Tableaux dynamiques: les bases (présentation) pict (168 Ko)



Tableaux statiques et structures: les bases (présentation) pict (115 Ko) pict (970 bytes)





Corrigé PDF


Exercice 3 pict (529 Ko)


Ce qui suit n’est à faire qu’après avoir compris les notions vues dans la feuille de TD 1.

*  C++ Wrapper in C

Un petit code pour illustrer l’intégration de code C++ à partir de code C.

random.tar.gz : pict (1062 bytes)

Dans le code C fourni, on utilise la bibliothèque random du C++11 pour générer un tableau de nombre aléatoire suivant la loi uniforme sur un intervalle donné. Pour celà, on encapsule/enrobe/wrap le code C++ utilisant des objets ou tout code non C dans une fonction dont l’interface/le prototype est purement du C. Dans le fichier header contenant ce prototype, on force le compilateur C++ à générer du code compatible avec le C par l’utilisation d’un extern C (voir fichier rand.h). Enfin, lors de l’édition des liens il faut ajouter la librairie standard C++ : -lstdc++.

Exercice 1 Dans le code, ajouter plusieurs fonctions permettant de générer des tableaux aléatoires suivant certaines lois :

Tous les détails sur les lois disponibles ici: random C++11

*  matwrapper

Un petit code experimental pour utiliser Matlab (graphiques compris) à partir de code C (sans passer par des fichiers de données).

matwrapper.tar.gz : pict (5533 bytes)

Exercice 2 L’objectif est d’arriver à compiler le code et à executer les deux tutorials fournis. Un fichier README est fourni.

*  octwrapper

Un petit code experimental pour utiliser Octave (graphiques compris) à partir de code C (sans passer par des fichiers de données).
A utiliser chez vous si vous n’avez pas Matlab.
Sur les machines du SERCAL, l’installation d’Octave à partir de flatpak ne permet pas l’utilisation de ce code.

octwrapper.tar.gz : pict (6131 bytes)

*  SLAC: version 0

Notre objectif sera la création d’une librarie simplifiée d’algèbre linéairee en langage C : S.L.A.C (Simple Linear Algebra in C). Pour démarrer, je vous fournis quelques codes à étudier ne contenant que des vecteurs.

SLACv0.tar.gz : pict (7967 bytes)

Il faut noter que ce code est fourni à titre pédagogique et qu’il contient un grand nombre de fonctions redondantes...

Exercice 3

  1. Compiler le code et executer le programme de test. Un Makefile est la pour vous aider...

  2. Dans le code de test, il y a une fuite mémoire... Pour la mettre en évidence, on peut compter le nombre d’allocations dynamiques réalisées (calloc/malloc) et le nombre de libérations mémoire (free). Le code a été prévue pour vous aider en celà:

    • Dans le Makefile, il faut modifier la variable CFLAGS pour definir DEBUG lors de la compilation:

      CFLAGS = -Wall  -DDEBUG
    • Ensuite, il faut recompiler le source Vector.c, créer l’executable et voir ce qui change a l’execution... Il faudra bien evidemment étudier comment le changement de comportement de l’executable a été introduit. On peut noter que PRINTMEMORYDEBUG est défini dans le fichier header slacgen.h.

    Pour repérer cette fuite mémoire, il est aussi possible, sur les machines du SERCAL, d’utiliser Valgrind :

    valgrind ./test01

*  SLAC: version 1

Il nous faut maintenant intégrer le type Matrix aux codes fournis précédemment. Le fichier header Matrix.h est fourni ainsi que le fichier Matrix_v0.c qui ne contient que la partie affichage des matrices.
Tous les étudiants devront implémenter dans un fichier Matrix.c les fonctions

La suite du travail devra être réparti entre 4 groupes. Voici la liste des fonctions à implémenter pour chacun des groupes



Groupe functions


1 RandMatrix, AllocRandMatrix, AllocRandMatrix_out


2 MatrixProd_out, MatrixProd


3 MatrixSum, MatrixSumAlloc, MatrixSum_out, MatrixSumLocLeft, MatrixSumLocRight


4 IdentityMatrix, IdentityMatrix_out,


4 Matrix2cst,


4 Matrix2zero,


1 ScaleMatrix,


4 TransposeMatrix, TransposeMatrix_out,


2 AllocRandSPDMatrix, AllocRandSPDMatrix_out,


3 AllocRandTriUpperMatrix, AllocRandTriUpperMatrix_out,


4 AllocRandTriLowerMatrix, AllocRandTriUpperMatrix_out,


1 Norm1Matrix,


1 NormInfMatrix,


2 fevalMatrix, fevalMatrix_out, fevalMatrix_in,


3 copyMatrix, copyMatrix_out.


Il y aura 4 fichiers à créer Matrix_gr1.c, Matrix_gr2.c, Matrix_gr3.c et Matrix_gr4.c et ils seront fournis par chacun des groupes. De plus, des programmes de tests seront fournis au format MatTest01_gr1.c, MatTest02_gr1.c, ... MatTest01_gr4.c, MatTest02_gr4.c, ... et la compilation se fera avec un Makefile par groupe: Makefile_gr1, ..., Makefile_gr4.

Il faut noter que certaines fonctions sont dépendantes de fonctions développées par un autre groupe. Par exemple AllocRandSPDMatrix pourra utiliser AllocRandTriLowerMatrix, TransposeMatrix, MatrixProd ...

Au final, un chef de projet regroupera l’ensemble des codes, sauf Matrix.c, (en concervant les noms de fichiers pour les fichiers *.c) et proposera un Makefile général.

SLACv1 version de Y. Zatout pict (2122 bytes)


Correction pict (9795 bytes)

*  SLAC: version 2

Il nous reste à écrire la partie intéressante d’algèbre linéaire: produits matricielles, produits matrice/vecteur, factorisation LU, factorisation de Cholesky, résolution de systèmes linéaires...

Le travail devra être réparti entre plusieurs groupes



Groupe functions


2 MatVecProd, MatVecProd_out


2 SolveLower, SolveLower_out


2 SolveUpper, SolveUpper_out


1 Cholesky, Cholesky_out


1 SolveCholesky, SolveCholesky_out


3 LU,


3 SolveLU, SolveLU_out


4 SolveGauss_in, SolveGauss, SolveGauss_out




SLACv2 version commune (packagée et corrigée par Y. Zatout) [14 nov. 2019] pict (15136 bytes)


SLACv2 version commune (packagée et corrigée par M. Piovi) [26 dec. 2019] pict (8961 bytes)


*  Priorité des opérateurs (ajouté le 17/10/2019)

Voici une présentation, à travailler en autonomie, sur la priorité des opérateurs pour vérifier que vous savez lire du C (attention cette partie est loin d’être triviale dans sa deuxième partie et rarement enseignée: supposé inné?)



Intitulé lien


Présentation: Apprendre à lire ... Priorité des opérateurs pict (252 Ko)
Résumé: priorité des opérateurs pict (43 Ko)


*  TP dérivation numérique (ajouté le 17/10/2019)

Pour votre plus grand bonheur, le TP sur la dérivation numérique est disponible. Il y a un peu de maths pour ceux qui sont en manque.

pict (204 Ko)

Pour de l’aide c’est ici Chapitre 2.

*  TP EDP 1D Stationnaire (ajouté le ??/10/2019)

pict (225 Ko)

Pour de l’aide c’est ici Chapitre 4, section 5.

*  TP Equation de la chaleur 1D en espace (ajouté le 20/11/2019)



Sujet codes


pict (240 Ko) pict (79 Ko)


Pour de l’aide c’est ici Chapitre 4, section 6.