Mise à Niveau d’un Simulateur vers C++11

Description

La programmation scientifique est un domaine très particulier qui combine plusieurs champs scientifiques et demande une très bonne connaissance de la programmation (structure de programme, optimisation, algorithme de haute performance, …). Il y a très peu de domaines qui demandent la maitrise à la fois des mathématiques, de la physique et de les combiner pour produire des produits technologiques (programmes informatiques) qui ont des applications dans différents domaines industriels. Par exemple en environnement, pour mesurer les impacts environnementaux, dans le jeu vidéo pour reproduire le monde physique virtuellement (effet de la gravite, …) pour ne nommer que ceux-ci. La programmation d’algorithmes mathématiques est un art et surtout un savoir-faire. Heureusement plusieurs langages et techniques sont apparues et nous permettent de structurer les programmes de façon concises et par concepts. Le résultat : plus facile à maintenir, tester et surtout à modifier, puisque le code est appeler à évoluer dans le temps.

Le code est un simulateur physique qui est un des modules de la compagnie (Elligno Virtual Physics Studio)., un ensemble de plusieurs modules (Classes C++ sous forme de librairies) qui permet de prototyper  des algorithmes physiques.   Les Équations de St-Venant unidimensionnelles sont solutionnées par une approche aux volumes finis.  Le programme utilise une approche procédurale ce qui rend difficile d’apporter des changements et de programmer de nouveaux algorithmes. On a décidé la réécriture du code en utilisant une technique Objet-Orientée Numérique  avec  le langage C++11. Principale raison : nous changeons notre méthodologie de développement vers une approche  «Test Driven Approach ». De plus, ce genre d’application demande une très grande flexibilité au niveau de la programmation d’algorithme physique et l’Objet-Orientée nous donne cette flexibilité.  Finalement, ceci va servir dans une collaboration industrielle (transfer technologique) afin de nous aider à mieux comprendre la physique par des modèles plus simples (voir page Produits sous Application). Dans les applications industrielles, le programmeur est très souvent appelé à prototyper des algorithmes et de les tester/valider.  Architecture OO permet définir une couche abstraite (par exemple niveau de l’algorithme)  et de programmer différentes implémentations en utilisant l’inheritance et les patrons de conception.  Ainsi le programmeur n’a pas à se soucier des détails de l’implémentation dans le code, mais sur sa tâche principale, de programmer des algorithmes physiques.

Code original (Analyse)

1. Plusieurs fonctions font beaucoup de travail (plus que ce qu’elles devraient faire, beaucoup plus);

2. Programmation numérique en C implique énormément de boucles, utilise des tableaux pour stocker les données et ensuite d’appliquer des algorithmes mathématiques sur celles-ci;

3. Plusieurs concepts sont absents (de base qui sont inherents a la methode), pas clair sur quoi la boucle est faite (cell face, noeuds), rend très difficile la compréhension du code;

4. Concepts de la méthode ne sont pas clair, par exemple méthode numérique de type volumes finis est utilisée, concepts de cell ou volume, de nœuds totalement absent ce qui rend le code très difficile à lire;

5. Les fonctions ont plusieurs responsabilités, ce qui rend difficile de programmer des variantes ou même d’étendre certains algorithmes;

6. Certaines fonctions calcules (exécute) plusieurs parties de l’algorithme principale, en modifiant cette fonction ceci a un effet sur tout le reste du code (ripple effect);

7. Beaucoup d’interdépendances entre les parties du code, impossible de tester les algorithmes séparément;

8. Beaucoup de variables globales qui sont hard-coder;

9. Pas possible de réutiliser certaines parties de code ou algorithmes sans faire du copie/coller, ce qui est de mon point de vue est une erreur (conduit à des bugs qui sont souvent très difficiles à retracer et à détecter);

10. Maintenance est extrêmement difficile, pour les raisons que nous venons de mentionnées;

 Migration (nouvelle architecture)

1. Ajout de tests unitaires, qui sont un must (nous avons adopte une approche « test driven approach »). De mon point de vue, cette façon de faire augmente significativement la qualité du code et rend plus productif. Pour chaque concept ou class correspond un test;

2. Ajout de types mathématiques (par exemple grille de calcul du domaine, notion de champ) ce qui facilite la compréhension du code. Également au niveau de l’algorithme numérique, concept de volume, de domaine de calcul, … qui rendent de loin le code plus lisible;

3. Programmation Orientée-Objet, on sépare les responsabilités. Chaque class a une responsabilité et doit être testable;

4. Utilisation de librairies externes telles que Boost library (connaitre Boost est un MUST!!!). Boost est un ensemble de librairies qui offre une très vaste gamme d’outils qui sont indispensables et des standards en programmation. Nous avons commencé à utiliser boost dans notre environnement de programmation (pointer container l, range, range algorithm, range adaptor, string library, iterator range, iterator pour nommer que ceux-ci);

5. Programmation avec la STL (Standard Templale Library), également un must. Avec les nouvelles fonctionnalités de C++11 telles que bind, lambda par exemple, c’est une autre façon de faire de la programmation scientifique. On élimine un très grand nombre de boucles qui proviennent de la programmation C et qui sont souvent des sources d’erreurs;

6. Mise en place d’une architecture (utilisation de certains patrons de conception tels que Singleton, Observer, Template) qui sont des standards en développement logiciel;

7. Ajout d’un GUI (Graphical User interface) pour faciliter la validation des algorithmes ainsi que la visualisation des résultats (Qt framework est la technologie que nous utilisons);

8. Couche abstraite de concepts (class abstraite) défini une interface pour différentes implémentations de l’algorithme (manipuler par le pointeur de base, polymorphisme);

0 réponses

Laisser un commentaire

Rejoindre la discussion?
N’hésitez pas à contribuer !

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *