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:
Groupe Algorithmique. Etudiants n’ayant jamais suivis cet enseignement et ayant eu une note inférieur strictement 15 en Langage C au semestre 6.
Groupe Langage C. Etudiants ayant déjà suivis cet enseignement ou ayant eu une note supérieure ou égale à 17 en Langage C au semestre 6. D’autres étudiants pourront être ajoutés à ce groupe (dans le but d’équilibrer les groupes) : étudiants ayant eu une note entre 15 (compris) et 17 (non compris) et ayant validé la partie info+Matlab du semestre 5.
Le Groupe Algorithmique fera l’ensemble des TPs de l’année 2018-2019.
La suite de cette page ne concerne que le Groupe Langage C.
Ce qui suit n’est à faire qu’après avoir compris les notions vues dans la feuille de TD 1.
Un petit code pour illustrer l’intégration de code C++ à partir de code C.
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 :
loi normal pour des réels (obligatoire),
loi uniforme sur un intervalle donné pour des entiers,
loi de Poisson pour des entiers,
...
Tous les détails sur les lois disponibles ici: random C++11
Un petit code experimental pour utiliser Matlab (graphiques compris) à partir de code C (sans passer par des
fichiers de données).
Exercice 2 L’objectif est d’arriver à compiler le code et à executer les deux tutorials fournis. Un fichier README est fourni.
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.
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.
Il faut noter que ce code est fourni à titre pédagogique et qu’il contient un grand nombre de fonctions redondantes...
Exercice 3
Compiler le code et executer le programme de test. Un Makefile est la pour vous aider...
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:
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 :
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
AllocMatrix, AllocMatrix_out AllocMatrixNC, AllocMatrixNC_out
freeMatrix, FREEMatrix.
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 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.
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 |
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 | ![]() |
Résumé: priorité des opérateurs | ![]() |
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.
Pour de l’aide c’est ici Chapitre 2.
Pour de l’aide c’est ici Chapitre 4, section 5.
Pour de l’aide c’est ici Chapitre 4, section 6.