crÉation d’un module plateforme de simulation …

38
Luisa VANEGAS ARISTIZÁBAL 5èmme année Génie Civil Master 2 SIG UNIVERSITÉ JEAN MONNET SAINT ETIENNE - ISTHME 6 rue Basse des Rives 42023 Saint-Etienne Cedex 2 Rapport de stage de Mars 2012 à Juillet 2012 CRÉATION D’UN MODULE DE LIAISON ENTRE UN SIG ET UNE PLATEFORME DE SIMULATION LBM (LATTICE BOLTZMANN METHOD) Luisa VANEGAS ARISTIZABAL 5eme année Génie Civil Master 2 SIG et Gestion de l’Espace Parcours Professionnel LABORATOIRE CETHIL INSA DE LYON 9 Rue de la Physique 69100 Villeurbanne France Septembre 2012

Upload: others

Post on 27-Nov-2021

3 views

Category:

Documents


0 download

TRANSCRIPT

Luisa VANEGAS ARISTIZÁBAL 5èmme année Génie Civil Master 2 SIG

UNIVERSITÉ JEAN MONNET SAINT ETIENNE - ISTHME 6 rue Basse des Rives – 42023 Saint-Etienne Cedex 2

Rapport de stage de Mars 2012 à Juillet 2012

CRÉATION D’UN MODULE DE LIAISON ENTRE UN SIG ET UNE PLATEFORME DE SIMULATION LBM (LATTICE BOLTZMANN METHOD)

Luisa VANEGAS ARISTIZABAL 5eme année Génie Civil – Master 2 SIG et Gestion de l’Espace

Parcours Professionnel

LABORATOIRE CETHIL INSA DE LYON

9 Rue de la Physique – 69100 Villeurbanne – France

Septembre 2012

Luisa VANEGAS ARISTIZÁBAL 5èmme année Génie Civil Master 2 SIG

REMERCIEMEMENTS

Je remercie dans un premier temps toute l’équipe pédagogique de l’ISTHME,

spécialement Monsieur Eric FAVIER pour m’avoir proposé ce stage et Monsieur

Thierry JOLIVEAU pour être une grande partie de ma formation académique et pour

l’aide et les conseils concernant ce stage.

Je tiens à remercier également mes collègues Ivan CUBILLOS et Diego CACERES

pour m’aider avec la récursivité des algorithmes.

Egalement Monsieur Gilles RUSAOUEN, mon tuteur, pour la confiance qu’il m’a

accordé et pour me permettre d’avoir une expérience aussi enrichissante.

Luisa VANEGAS ARISTIZÁBAL 5èmme année Génie Civil Master 2 SIG

Table des matières

1. PRESENTATION LABORATOIRE CETHIL – INSA DE LYON ....................................................... 1

2. LATTICE BOLTZMANN METHOD ............................................................................................ 2

3. OBJECTIF ET MÉTHODOLOGIE ............................................................................................... 4

4. CHOIX DES LOGICIELS ............................................................................................................ 6

5. LES DONNÉES ET LEUR TRAITEMENT .................................................................................... 7

6. LE FORMAT MULTIPATCH...................................................................................................... 9

7. CONSTRUCTION DU MAILLAGE ........................................................................................... 17

a. Idées de base ................................................................................................................... 17

b. Algorithmie ...................................................................................................................... 18

c. Résultats sous Matlab ..................................................................................................... 22

d. Résultats sous Python ..................................................................................................... 24

e. Résultats sous C++ ........................................................................................................... 26

8. CONCLUSIONS ..................................................................................................................... 27

9. BIBLIOGRAPHIE .................................................................................................................... 28

10. ANNEXES ......................................................................................................................... 28

a. Script sous Matlab ........................................................................................................... 28

b. Script sous Python ........................................................................................................... 32

c. Script sous C++ ................................................................................................................ 33

Luisa VANEGAS ARISTIZÁBAL 5èmme année Génie Civil Master 2 SIG

1

1. PRESENTATION LABORATOIRE CETHIL – INSA DE LYON

Le CETHIL a été fondé en 1982 par la réunion de deux laboratoires (Laboratoire de

Physique Industrielle, Laboratoire de Mécanique des Fluides et Thermiques), et d'une équipe

(Equipe de l'Habitat), auxquels s'est joint en 1986 un autre laboratoire (Laboratoire

d'Energétique et d'Automatique). Initialement, le laboratoire ressemblait plutôt à une

structure fédérative, œuvrant dans un champ disciplinaire commun, utilisant des moyens

partagés, et dont les membres étaient en charge des enseignements de cette discipline dans

différents départements de l'Institut National des Sciences Appliquées (INSA) de Lyon et

à l'Université Claude Bernard-Lyon1 (UCBL).

Associé au Centre National de la Recherche Scientifique (CNRS) à partir de 1989, le

laboratoire s'est regroupé sur deux sites à partir de 1994 et son nombre d'équipes réduit à

trois en 1997. Depuis 1996, le CETHIL est également rattaché officiellement à l'UCBL. En

2000, il a obtenu son statut d'Unité Mixte de Recherche (UMR).

Le Centre de Thermique de Lyon, UMR 5008, organisé depuis 2004 en 6 thématiques scientifiques, est rattaché à trois établissements :

1. Le CNRS et en particulier le Département Ingénierie (ST2I) section 10 CN. Administrativement, il est également rattaché de la Délégation Régionale Rhône Auvergne,

2. l'INSA de Lyon, établissement principal de rattachement qui l'héberge, 3. l'Université Claude Bernard Lyon I.

Dans le cadre de l'INSA, le CETHIL est lié au Département du Premier Cycle et à trois Départements, Génie Energétique et Environnement (GEN), Génie Civil et Urbanisme (GCU), Génie Mécanique et Conception (GMC), par des conventions département-laboratoire. Il apparaît aussi comme laboratoire du Pôle de compétence « Energie - Environnement-» affiché par l'établissement.

Son rattachement à l'UCBL (Université Claude Bernard Lyon 1) se traduit par son implication

dans deux départements de l'Institut Universitaire et Technologique (IUT A), le Département

de Génie Civil et celui de Génie Thermique et Energie, et à un Institut Universitaire

Professionnel (IUP) de Génie Civil. Administrativement, il relève de l'Unité de Formation et

de Recherche (UFR) de Mécanique.

L'ensemble de ces établissements dépend d'une même tutelle : le Ministère de l'Education

Nationale, de l'Enseignement Supérieur et de la Recherche.

Le Centre de Thermique de Lyon dispose aujourd'hui d'une surface totale de l'ordre de

2500m2, répartie sur cinq sites.

Luisa VANEGAS ARISTIZÁBAL 5èmme année Génie Civil Master 2 SIG

2

Ses bureaux sont installés principalement sur deux sites, les 2ème et 3ème étages du

bâtiment Sadi Carnot et sur une partie du rez-de-chaussée et du 1er étage du bâtiment

Eugène Freyssinet.

Les dispositifs expérimentaux importants développés par le laboratoire occupent des

surfaces dans trois autres bâtiments, Claude Chappe, Gustave Eiffel et Blaise Pascal.

2. LATTICE BOLTZMANN METHOD La méthode Lattice Boltzmann, – nous l’appellerons désormais LBM –, est une méthode assez nouvelle qui est attirante pour les chercheurs du champ de la turbulence et des écoulements polyphasiques en milieu poreux. La LBM est une classe de la Mécanique des Fluides Numérique, une méthode de simulation d’écoulement de fluide. L’équation de Boltzmann décrit l’évolution d’un gaz peu dense hors d’équilibre. Au lieu de résoudre les équations de Navier-Stokes1, l’équation de Boltzmann discrète est résolue pour simuler l’écoulement d’un fluide newtonien avec des modèles de collision telles que Bhatnagar-Gross-Krook (BGK)2. En physique statique, un gaz est décrit par un nuage de particules obéissant à l’équation de Boltzmann, écrite sous la forme suivante :

(2.1)

Où représente la densité de la particule ayant la vitesse c au point x et au temps t. F désigne les forces extérieures et m la masse moléculaire du gaz. Pour le développement de l’équation ci-dessous nous ne considérons aucune force extérieure et les effets de la gravité seront négligés. On peut alors recalculer les paramètres macroscopiques comme la masse volumique ρ et la quantité de mouvement ou encore l’énergie de la façon suivante :

(2.2)

1 Les équations de Navier-Stokes sont des équations aux dérivées partielles qui décrivent un mouvement non

linéaire d’un fluide. Ces équations modélisent l’atmosphère terrestre, les courants océaniques et l’écoulement autour des véhicules ou des projectiles et, en général, tout phénomène dans lequel des fluides newtoniens sont impliqués. 2 L’opérateur Bhatnagar-Gross-Krook (BGK) s’agit d’un opérateur de collision utilisé dans l’équation de

Boltzmann et dans la LBM : où

est une valeur d’équilibre local pour la population de

particules dans la direction de liaison ei. Le terme est un temps de relaxation, et liée à la viscosité.

Luisa VANEGAS ARISTIZÁBAL 5èmme année Génie Civil Master 2 SIG

3

(2.3)

(2.4)

L’opérateur de collision

décrit l’effet des collisions entre particules. En ne

considérant que les collisions binaires, transformant les vitesses [c1, c2] (pré-collision) en [

] (post-collision) et en faisant l’hypothèse de chaos moléculaire3, cet opérateur peut

s’écrire sous la forme :

(2.5)

Où est la section différentielle de collision.

Dans la pratique l’équation de Boltzmann est résolue sous forme discrète. Pour cela on réalise un maillage de l’espace à simuler, régulier en x, y et z. On obtient donc des points de

calcul :

Figure 1. Exemple d’un maillage avec des points de calcul

La méthode utilise de plus une discrétisation de l’espace de la vitesse :

3 Les vitesses de deux particules avant collision sont décorrélées.

Luisa VANEGAS ARISTIZÁBAL 5èmme année Génie Civil Master 2 SIG

4

Figure 2. Discrétisation de la vitesse

Donc pour pouvoir réaliser la simulation il faut disposer d’un maillage de points de la zone à

calculer et, sur les bords de la zone de calcul (au niveau des conditions aux limites) il faut les

longueurs entre les points de calcul les plus proches des bords et les bords dans les

différentes directions de discrétisations de la vitesse. Il faut de plus disposer d’informations

thermiques et aéraulique concernant ce bord.

Cette méthode est utilisée dans des modèles aéraulique-thermiques pour les écoulements d’air par exemple autour des bâtiments de la ville de Lyon. Il est donc important d’établir une liaison entre la représentation SIG d’une ville et la simulation LBM pour avoir une approche générale de la simulation aéraulique-thermique des quartiers ou des villes.

3. OBJECTIF ET MÉTHODOLOGIE L’objectif de ce stage est donc de créer un module de liaison entre un Système d’Information Géographique (SIG) et une plateforme de simulation LBM, pour la visualisation des données aérauliques et thermiques dans l’espace. Ces données thermiques ne sont pas sur un format spécifique lisible par un SIG, non plus par un logiciel CAO (Conception Assistée par Ordinateur). Elles font parties des modèles LBM, c’est pourquoi nous sommes intéressés au développement d’un outil liaison. Pour cela nous avons pensé une méthodologie simple :

Luisa VANEGAS ARISTIZÁBAL 5èmme année Génie Civil Master 2 SIG

5

1. Nous commençons pour l’obtention des données (MNT4, bâtiments, routes5) ou leur fabrication pour une ville typique sur un format que l’on puisse visualiser sous un SIG (Shapefile, GML, XML, SLD, KML, EWC, GeoTIFF, ou d’autres).

2. Ensuite, nous voulons réaliser un maillage des points visible sous le SIG, dans les mêmes coordonnées géographiques du MNT – Soit par programmation, soit par création CAO et enregistrement en tant que couche (sur un des formats précédents) –.

3. D’après la visualisation du maillage sur la ville sous le SIG, nous cherchons les points du maillage à l’intérieur des bâtiments pour les extraire ou les supprimer ou les déplacer pour les mettre sur le bord du bâtiment.

Figure 3. Représentation de la manipulation souhaitée.

Maillage de points + polygone

Cette procédure doit pouvoir se réaliser de manière efficace pour un ilot typique.

4. Finalement les données aérauliques et thermiques seront ajoutées aux points du maillage pour une visualisation du climat.

4 MNT (Modèle Numérique de Terrain) : Représentation graphique du relief et de la topographie d’un terrain.

5 Des polygones et polylignes créés sous un CAO + l’insertion d’une table attributaire qui contient de

l’information sur l’élément dessiné.

Luisa VANEGAS ARISTIZÁBAL 5èmme année Génie Civil Master 2 SIG

6

4. CHOIX DES LOGICIELS Pour le SIG, nous sommes partis de l’idée d’un logiciel open source parce qu’il y en a beaucoup de très puissants avec autant fonctions que les logiciels payants comme MapInfo. Au départ, notre plus grand intérêt était pour :

les fonctions 3D

un module de codage y compris pour un éventuel besoin de programmation. Ci-dessous la liste des logiciels regardés avant de commencer l’étude :

QuantumGIS – GRASS 1.7.4

Virtual Terrain Project VTP 9

ArcGIS 10.0

MapInfo 10.0 En explorant les différents logiciels disponibles nous avons trouvé une fonction sous ArcGIS pour l’interpolation des données qui n’est pas présente sous d’autres logiciels – même payants – : Interpolation de Krigeage (Kriging Interpolation). Pourtant cette méthode peut être programmée au cas où nous ayons besoin plus tard ; mais celle-ci et d’autres fonctions du module 3D Spatial Analyst d’ArcGIS nous ont fait hésiter. Néanmoins, nous avons décidé de commencer avec un logiciel open source, avec un esprit ouvert au changement au cas où les fonctions ne soient pas satisfaisantes. QuantumGIS (QGIS) – GRASS a été le logiciel open source choisi car assez complet et pour lequel nous nous sentions à l’aise. Dû aux différentes contraintes dont nous parlerons par la suite, nous avons finalement gardé ArcGIS comme le seul SIG à utiliser tout au long du stage. Quant au langage de programmation, nous avons tout d’abord pensé à faire le maillage sous Matlab et à l’enregistrer en format kml pour le visualiser en tant que couche sous le SIG. Cette solution n’a pas été retenue car il semblait un peu compliqué pour une modification de la taille du maillage. En plus, il y a un module Python sous ArcGIS donc nous avons décidé de programmer le maillage directement avec ce langage. Sur la marche nous avons constaté que Python est un langage assez lourd et qui ne gère pas bien la 3D. Le langage C++ a été donc utilisé en essayant de trouver un temps d’exécution satisfaisant pour notre algorithme. En raison du confort dû à la visualisation, Matlab a été utilisé pour une première approche de la solution Enfin nous avons testé le programme sous les 3 langages : Matlab, Python et C++.

Luisa VANEGAS ARISTIZÁBAL 5èmme année Génie Civil Master 2 SIG

7

5. LES DONNÉES ET LEUR TRAITEMENT Des données d’un petit village près de Lyon, nommé Pélussin, sont à notre disposition pour le développement de cette étude. Sur le tableau suivant, nous donnons des détails des données :

NOM DE LA COUCHE

NB. DE DONNEES

SUR LA COUCHE

PARAMETRES ATTRIBUTAIRES DISPONIBLES

Chemins 225 Shape, Source, Nature, Nom, Position sol

Routes 407 Shape, Source, Nature, Classement, Département de gestion, Largueur, Nom, Nombre de voies, Numéro,

Position Sol

Bâtiments 768 Shape, Source, Catégorie, Nature, Hauteur

Corine Land Cover (CLC)

30 Shape, Surface, Périmètre, CLC00 FR, CLC00 FR I,

Code 00, e00 Centro, e00 Centro 1

MNT Image TIFF

Toutes les couches en format Shapefile. Les données 3D étant très dures à trouver, nous n’en utilisons que les 2D. Cela nous pose la première question : Comment convertir les données 2D en 3D ? La réponse est : Par extrusion 3D des polygones. Il existe certains logiciels qui en font mais non pas beaucoup. Nous avons regardé les options trouvées soit en passant par AutoCAD, soit par MapInfo avec un engagement 3D Pro, soit par ArcGIS avec le module 3D Analyst et ArcScene. Aucun logiciel open source n’offre cette fonction. A l’INSA, nous disposons de licences pour certains logiciels, entre autre AutoCAD et MapInfo, donc nous avons essayé ce traitement tout d’abord avec ces deux :

L’extrusion de polygones par AutoCAD est bien possible mais pas efficace. Du fait que c’est une CAO, ce logiciel ne reconnait pas l’information sauvegardée sur la table attributaire de la donnée, nous ne voyons que les polygones. L’extrusion doit se faire donc manuellement, donnant la valeur de l’altitude polygone par polygone. Cette manipulation est déjà longue pour un petit village de 768 bâtiments ; pour une grande ville ce n’est pas une possibilité. Nous n’avons pas gardé cette option.

Ensuite, nous avons demandé une licence MapInfo avec l’engagement 3D Pro. Celle-ci n’est pas disponible à l’INSA. Nous n’avons pas pu tester cette option.

Enfin, avant de penser à acheter une licence ArcGIS, nous avons essayé de faire cette manipulation à la faculté et ensuite enregistrer le projet sur un format lisible par d’autres logiciels – QGIS par exemple –. Malheureusement ce n’est pas possible. Un projet 3D créé

Luisa VANEGAS ARISTIZÁBAL 5èmme année Génie Civil Master 2 SIG

8

sous ArcScene est enregistré uniquement en format ESRI ArcScene Document (.sxd). Si nous voulons exporter le projet en 3D le seul format disponible est le VRML6 en extension .wrl qui ne permet pas des modifications et sa visualisation n’est possible que sur Internet Explorer. Enfin, nous avons constaté que QGIS ne contenait pas des fonctions qui correspondaient à nos besoins. En conséquence nous avons décidé d’acheter une licence ArcGIS complète pour le développement de cette étude. L’extrusion de bâtiments à été faite donc en utilisant ArcScene. Ci-dessous des images d’après cette procédure :

Figure 4. Extrusion des polygones – couche bâtiments – sous ArcScene

6 Virtual Reality Modeling Language ou Virtual Reality Markup Language ; Un format standard pour la

représentation des objets en 3D particulièrement pour le web.

Luisa VANEGAS ARISTIZÁBAL 5èmme année Génie Civil Master 2 SIG

9

Figure 5. Extrusion des polygones – couche bâtiments – sous ArcScene

Néanmoins, nous avons le besoin d’avoir accès indépendant à chaque face des polygones. Les données thermiques ne sont pas les mêmes d’un côté du bâtiment sous l’ombre que d’un côté du bâtiment avec du rayon solaire, par exemple. L’extrusion de polygones ne nous donne pas cette possibilité. Pour cela nous devions passer par un CAO et exploiter chacun des polygones en 2D et puis les extruder perdant toute l’information de la table attributaire. De plus, nous avions besoins de quelques informations sur les bâtiments extrudés, genre pente du toit des polygones, pourcentage de vitrage par façade, couleur du mur, occupation du sol, entre autres. Ces informations existent mais elles sont très limitées : que pour certaine villes ou certains bâtiments, les plus représentatifs. Enfin ces données ne nous sont pas satisfaisantes pour la réalisation de notre étude.

6. LE FORMAT MULTIPATCH Il existe un type de géométrie appelée « Multipatch », un format développé par ESRI en 1997. C’est une géométrie utilisée comme une représentation de limite pour les objets 3D. C’est une donnée créée à partir de quatre éléments : Triangle Strips, Triangle Fan, Triangles and Rings. Une donnée multipatch contient, au moins, une de ces géométries (explication ci-dessous).

Luisa VANEGAS ARISTIZÁBAL 5èmme année Génie Civil Master 2 SIG

10

Géométrie Description

esriGeometryRing Une région délimitée par un chemin fermé

esriGeometryTriangleStrip Un élément de surface de triangles définis par trois points consécutifs.

esriGeometryTriangleFan Un élément de surface de triangles définis par le premier point et deux points consécutifs

esriGeometryTriangles

Un élément de surface de triangles définis par des non-ensembles qui se chevauchent de trois points consécutifs chacun

Le multipatch est utilisé pour la construction des objets 3D, pour garder l’information existante et pour échanger de l’information avec des logiciels non-SIG. Le multipatch a été créé au début avec le but d’avoir accès aux informations des façades des polygones, comme l’orientation. Le multipatch enregistre information telle que la texture de l’image, la couleur, la transparence et le vecteur normal de l’éclairage. Ces géométries peuvent se faire manuellement utilisant la programmation en langage Python. L’enregistrement de l’information est un procès parallèle à la construction des géométries. Pourtant cette procédure nécessite beaucoup de dédicace et de connaissance. La guide « ESRI, The Multipatch Geometry Type » présent des exemples pour apprendre à construire des éléments multipatch pas compliqués. Ci-dessous, des images des géométries Multipatch :

Figure 6. Exemple de la géométrie Ring

Luisa VANEGAS ARISTIZÁBAL 5èmme année Génie Civil Master 2 SIG

11

Figure 7. Exemple de la géométrie Triangle Strip

Figure 8. Exemple de la géométrie Triangle Fan

Luisa VANEGAS ARISTIZÁBAL 5èmme année Génie Civil Master 2 SIG

12

Figure 9. Exemple de la géométrie Triangle

Ayant les informations requises (pente du toit des polygones, pourcentage de vitrage par façade, couleur des murs, orientation des façades, éclairage solaire), il est possible de construire les bâtiments en 3D exactement comme nous en avons besoin. Mais celui-ci serait un stage ou travail différent. Ci-dessous, un exemple d’un bâtiment réalisé en format multipatch :

Figure 10. Vue générale du bâtiment construit

Luisa VANEGAS ARISTIZÁBAL 5èmme année Génie Civil Master 2 SIG

13

Figure 11. Pas 1 : Définir la liste des matériaux

Figure 12. Pas 2 : Démarrage du « GeneralMultipatchCreator »

Figure 13. Pas 3 : Définir le type de patch

Luisa VANEGAS ARISTIZÁBAL 5èmme année Génie Civil Master 2 SIG

14

Figure 14. Pas 4 : Définir les indices du matériel

Figure 15. Pas 5 : Définir les indices et les textures de départ

Luisa VANEGAS ARISTIZÁBAL 5èmme année Génie Civil Master 2 SIG

15

Figure 16. Pas 6 : Définir les points

Luisa VANEGAS ARISTIZÁBAL 5èmme année Génie Civil Master 2 SIG

16

Figure 17. Pas 7 : Définir les points de texture

Luisa VANEGAS ARISTIZÁBAL 5èmme année Génie Civil Master 2 SIG

17

Figure 18. Bâtiment construit

7. CONSTRUCTION DU MAILLAGE

a. Idées de base Tout au début du projet, nous pensions mettre le maillage directement dans le SIG pour une visualisation dans le contexte (ici le village). Pour cela, nous avons décidé de faire le maillage sous Matlab, ajoutant une ligne de codage pour la transformation du fichier et son enregistrement en format kml : le format le plus simple à créer lisible par le SIG. Nous avons également pris les coordonnées des frontières du MNT aussi que le point d’élévation maximale. Cette information nous serait utile pour la délimitation des limites de notre maillage. L’importation du maillage est complètement faisable. Mais, pour ne pas commencer à trop mélanger les logiciels, nous avons choisi de réaliser le maillage en langage Python, le langage de QGIS et d’ArcGIS.

Luisa VANEGAS ARISTIZÁBAL 5èmme année Génie Civil Master 2 SIG

18

A ce moment là, nous avions déjà acheté la licence d’ArcGIS et nous voulions faire le maillage en programmant directement sous le module Python du logiciel. Ce module, en étant lié au SIG, a certaines contraintes : Il ne permet pas de créer de nouveaux éléments pour visualiser sur l’interface d’ArcGIS. Il ne permet que d’automatiser des processus à faire sur les données importées sur le SIG. Pour avoir une bonne base de programmation, il faut programmer en dehors du module du SIG. Nous pouvons utiliser le même langage mais là où toutes les fonctions nous sont disponibles. Après il existe un logiciel open source (celui-ci nous n’avons pas testé), AVPython, qui a été créé comme support d’ArcView et permet de passer les scripts les plus complexes sur le SIG. Ainsi nous avons abandonné l’idée de visualiser le maillage sur le SIG. De plus, il est apparu que les traitements sont lents avec les langages de script comme Pyhton ou Matlab. D’où l’idée de programmer un test de faisabilité : un petit îlot typique de 10 parallélépipèdes (bâtiments) situés de manière aléatoire dans un maillage de 1'000.000 de points (100 en x, 100 en y et 100 en z) juste pour tester le temps que nous mettions à savoir quels points du maillage étaient dans les parallélépipèdes. Et le même test pour différentes tailles du maillage permettra de définir les limites du traitement de base. Nous risquions en effet d’avoir un temps très grand qui pourrait empêcher l’évolution de notre étude. Dans un premier temps, nous avions décidé de faire ce programme en Python, pour continuer avec notre méthodologie d’utilisation de peu de logiciels. La fonction pour créer les parallélépipèdes était dure à trouver pourtant. Nous n’avancions pas beaucoup. Sur Matlab par contre nous avons deux avantages : la visualisation des résultats et la facilité du langage (le logiciel est assez complet et il comprend beaucoup de fonctions). Nous avons donc réalisé le test d’abord dans ce langage. Enfin, l’exécution du script en python étant assez longue, nous avons fait un troisième essai en C++.

b. Algorithmie La théorie de l’algorithme est la suivante : Nous voulons tout d’abord un maillage de 1'000.000 de points (100 en x, 100 en y et 100 en z). Les points du maillage seront des données thermiques plus tard.

Luisa VANEGAS ARISTIZÁBAL 5èmme année Génie Civil Master 2 SIG

19

Figure 19. Système coordonnées.

Ensuite, nous allons représenter les bâtiments par des parallélépipèdes. Pour un maillage aussi petit, 10 parallélépipèdes suffiront. La disposition des bâtiments dans le maillage est leur taille n’est pas fixée. Il nous suffit qu’ils soient à l’intérieur du maillage et d’une taille plus ou moins en accord d’échelle pour représenter un petit quartier. Les bases des parallélépipèdes sont créées de manière aléatoire. Nous partons d’un point : . Nous nous déplaçons une distance delta aléatoire qui nous amènera à un point

.

Figure 20. Exemple d’un « parallélépipède » typique et les coordonnées de ses sommets.

Luisa VANEGAS ARISTIZÁBAL 5èmme année Génie Civil Master 2 SIG

20

Ensuite nous voulons savoir si un point du maillage se trouve à l’intérieur d’un bâtiment ou pas. Ce test pour le million de points :

Enfin ce qui nous intéresse le plus est de connaître le temps que la machine met à tester tous les points du maillage pour différentes tailles ; différent nombre de points et de bâtiments.

Figure 21. Exemple du graphique cherché avec trois tailles de maillage

Ci-dessous, une image qui montre à peu près ce que nous voulons construire :

Luisa VANEGAS ARISTIZÁBAL 5èmme année Génie Civil Master 2 SIG

21

Figure 22. Image d’un maillage + un bâtiment (exemple)

Le script est très simple. Un diagramme de flux du code est montré sur la figure 23.

Figure 23. Diagramme de flux du script maillage + bâtiments

Luisa VANEGAS ARISTIZÁBAL 5èmme année Génie Civil Master 2 SIG

22

c. Résultats sous Matlab Nous avons testé ce programme pour 5 tailles de maillage. Nous sommes allés le plus loin possible en nombre de points. Le nombre de bâtiments a été augmenté proportionnellement au nombre de points. Le script se trouve dans les annexes. Pour le maillage de 100x100x100 (un million de points) nous avons ces images :

Figure 24. Localisation des bases

Luisa VANEGAS ARISTIZÁBAL 5èmme année Génie Civil Master 2 SIG

23

Figure 25. Bases situées

Figure 26. Image final pour 74996 points à l’intérieur des bâtiments

Luisa VANEGAS ARISTIZÁBAL 5èmme année Génie Civil Master 2 SIG

24

Des images comme celles-ci-dessus nous en avons pour tous les tests. Le tableau suivant montre les détails des essais.

Dimension maillage

Nb. De points Nb. De

bâtiments Nb. De points à

l'intérieur des bâtis

Temps d'exécution

(sec)

100x100x100 1,00E+06 10 74996 3,749

500x500x500 1,25E+08 50 149252 4,211

1000x1000x1000 1,00E+09 100 1236484 19,427

5000x5000x5000 1,25E+11 500 6716824 237,453

10000x10000x10000 1,00E+12 1000 32328068 1003,28

Enfin nous avons le graphique pour le temps de calcul :

Figure 27. Temps de calcul pour 5 essais sous Matlab

d. Résultats sous Python Python est un langage de très haut niveau, utilisé dans les domaines du web, des graphiques, de réseau, etc., open source et gratuit et le langage choisi pour les SIG. Cependant il ne gère pas bien les listes et la 3D, et c’est un langage assez lourd qui prend beaucoup de mémoire de l’ordinateur à exécuter un programme.

1,076

151,076

301,076

451,076

601,076

751,076

901,076

1051,076

1201,076

1,00E+06 2,00E+11 4,00E+11 6,00E+11 8,00E+11 1,00E+12

Tem

ps

d'e

xécu

tio

n

Nb. de points

Temps de calcul

Luisa VANEGAS ARISTIZÁBAL 5èmme année Génie Civil Master 2 SIG

25

En conséquence nous n’avons pas réussi à faire un programme 3D comme celui de Matlab ; en revanche nous avons fait le script en 2D, uniquement la construction du maillage plus les bâtiments, sans le test des points à l’intérieur des bâtiments. Pour ce cas nous avons testé 3 tailles de maillage et nous sommes arrivés le plus loin possible, après l’ordinateur plantait. Ci-dessous les détails des essais.

Dimension maillage Nb. De points

Nb. De bâtiments Temps

d'exécution (sec)

100x100 1,00E+04 10 0,6353

500x500 2,50E+05 50 70,4608

1000x1000 1,00E+06 100 1022,3647

Et le temps de calcul :

Figure 28. Temps de calcul pour 3 essais sous Python

0

200

400

600

800

1000

1200

1,00E+04 2,10E+05 4,10E+05 6,10E+05 8,10E+05 1,01E+06 1,21E+06

Tem

ps

d'e

xécu

tio

n

Nb. de points

Temps de calcul Python

Luisa VANEGAS ARISTIZÁBAL 5èmme année Génie Civil Master 2 SIG

26

e. Résultats sous C++ En raison de praticité nous avons fait le même script de Python sous C++. Ci-dessous les détails des essais :

Dimension maillage

Nb. De points Nb. De

bâtiments Temps d'exécution

(sec)

100x100 1,00E+04 10 0,197

500x500 2,50E+05 50 15,42

1000x1000 1,00E+06 100 70,18

5000x5000 2,50E+07 500 971,268

10000x10000 1,00E+08 1000 4002,457

Figure 29. Temps de calcul pour 5 essais sous C++

0

500

1000

1500

2000

2500

3000

3500

4000

4500

1,00E+04 2,00E+07 4,00E+07 6,00E+07 8,00E+07 1,00E+08

Tem

ps

d'e

xécu

tio

n

Nb. de points

Temps de calcul C++

Luisa VANEGAS ARISTIZÁBAL 5èmme année Génie Civil Master 2 SIG

27

8. CONCLUSIONS

Entre les logiciels open source nous n’en avons pas trouvé un d’assez puissant pour l’extrusion des données et ainsi pour la réalisation de notre étude.

L’extrusion des polygones ne nous permet pas d’avoir accès indépendant à chaque face du polygone. Pas qui est important pour introduire les données thermiques de chaque face d’un bâtiment.

Il existe un format de donnée appelé Multipatch qui permet de construire une couche avec toutes les informations nécessaires pour cette étude : pente du toit des polygones, pourcentage de vitrage par façade, couleur du mur, occupation du sol, matériaux du bâtiment, entre autres.

Le module Python sous ArcGIS présente des contraintes par rapport aux modules et aux fonctions disponibles car liée au SIG.

Python étant un langage assez complet et compliqué, nous avons décidé de tester le temps de calcul tout d’abord sous Matlab.

Le temps de calcul sous Matlab n’est pas très long. Nous sommes arrivés à un maillage de 10.000x10.000x10.000 avec 1000 bâtiments qui a pris près de 20 minutes à exécuter. Nous ne sommes pas allés plus loin car manque de mémoire de l’ordinateur.

Le script sous Python a été fait en 2D parce que ce langage ne gère pas bien la 3D et les listes.

Le script 2D sous Python a mis beaucoup plus de temps que le script sous Matlab en 3D. Des temps d’exécutions trop longs pour procéder avec cette solution. En conséquence nous n’avons pas gardé ce langage pour continuer.

Du coup nous avons fait un troisième essaie en langage C++. Il a mis moins du temps à exécuter mais Matlab est toujours le plus performant.

Nous essayons donc de trouver un moyen de passage depuis C++ vers un SIG. Cette procédure nécessite de beaucoup de connaissance en informatique et plus de temps de travail.

Luisa VANEGAS ARISTIZÁBAL 5èmme année Génie Civil Master 2 SIG

28

9. BIBLIOGRAPHIE [1] WAGNER Alexander. – “A practical introduction to the Lattice Boltzmann Method”. North Dakota State University. March 2008. [2] MARIE Simon. – « Etude de la méthode Boltzmann sur réseau pour les simulations en aéroacoustique ». Thèse de doctorat de l’Université Pierre et Marie Curie. Février 2008. [3] DUMOLARD Pierre ; DYRAS Izabela. – “Spatial Interpolation for Climate Data. The use of GIS in climatology and meteorology”. Geographical Information Systems Series. 2007. [4] OBRECHT Christian; KUZNIK Frédéric; TOURANCHEAU Beranrd; ROUX Jean-Jacques.- “Towards urban-scale flow simulations using the Lattice Boltzmann Method”. [5] LANGTANGEN Hans Petter. – “Python Scripting for Computational Science”. Texts in Computational Science Engineering. Third Edition. Springer, Germany 2004. [6] CASAMAYOU-BOUCAU Alexandre ; CHAUVIN Pascal ; CONNAN Guillaume. – « Programmation en Python pour les mathématiques ». Dunod, Paris 2012. [7] ESRI. – “The Multipatch Geometry Type”. An ESRI White Paper. December 2008.

10. ANNEXES

a. Script sous Matlab Le script suivant est celui qui construit un maillage de 1'000.000 de points et 10 bâtiments et fait le test des points (dedans ou dehors les bâtiments). t0=clock; m=100 n=100 o=100 [X Y]=meshgrid(1:1:m,1:1:n) Z=X*0+Y*0 C=zeros(10,4) P=zeros(10,5) k=1;

Luisa VANEGAS ARISTIZÁBAL 5èmme année Génie Civil Master 2 SIG

29

cont=9; hold on for i=1:10 C(i,1)=floor(m*rand()) C(i,2)=floor(n*rand()) C(i,3)=floor(10*rand()+1) C(i,4)=floor(10*rand()+1) if (C(i,1)-C(i,3)<=1 || C(i,1)+C(i,3)>=m ||C(i,2)-C(i,4)<=1 || C(i,2)+C(i,4)>=n) C(i,1)=floor(m*rand()) C(i,2)=floor(n*rand()) C(i,3)=floor(10*rand()+1) C(i,4)=floor(10*rand()+1) end P(i,1)=C(i,1)+C(i,3) P(i,2)=C(i,1)-C(i,3) P(i,3)=C(i,2)+C(i,4) P(i,4)=C(i,2)-C(i,4) P(i,5)=2*min(P(i,1)-P(i,2),P(i,3)-P(i,4)) for k=1:i-1 for s=P(i,2):P(i,1) for t=P(i,4):P(i,3) if(s<P(k,1) && s>P(k,2) && t>P(k,4) && t<P(k,3)) cont=9; while cont<10 cont=10 plot(C(i,1),C(i,2),'ro',[P(i,2) P(i,1)],[P(i,3) P(i,3)],[P(i,1) P(i,1)],[P(i,3) P(i,4)],[P(i,2) P(i,2)],[P(i,3) P(i,4)],[P(i,2) P(i,1)],[P(i,4) P(i,4)]) text(C(i,1),C(i,2),[sprintf('%d',i)],'HorizontalAlignment','center'); C(i,1)=floor(m*rand()) C(i,2)=floor(n*rand()) if (C(i,1)-C(i,3)<=1 || C(i,1)+C(i,3)>=m ||C(i,2)-C(i,4)<=1 || C(i,2)+C(i,4)>=n) C(i,1)=floor(m*rand()) C(i,2)=floor(n*rand()) end P(i,1)=C(i,1)+C(i,3) P(i,2)=C(i,1)-C(i,3) P(i,3)=C(i,2)+C(i,4) P(i,4)=C(i,2)-C(i,4) P(i,5)=2*min(P(i,1)-P(i,2),P(i,3)-P(i,4)) for p=1:i-1 for r=P(i,2):P(i,1) for u=P(i,4):P(i,3)

Luisa VANEGAS ARISTIZÁBAL 5èmme année Génie Civil Master 2 SIG

30

if(r<P(p,1) && r>P(p,2) && u>P(p,4) && u<P(p,3)) cont=cont-1 plot(C(i,1),C(i,2),'rx') end end end end hold on plot(C(i,1),C(i,2),[P(i,2) P(i,1)],[P(i,3) P(i,3)],[P(i,1) P(i,1)],[P(i,3) P(i,4)],[P(i,2) P(i,2)],[P(i,3) P(i,4)],[P(i,2) P(i,1)],[P(i,4) P(i,4)]) text(C(i,1),C(i,2),[sprintf('%d',i)],'HorizontalAlignment','center'); drawnow end end end end end hold on plot(C(i,1),C(i,2),[P(i,2) P(i,1)],[P(i,3) P(i,3)],[P(i,1) P(i,1)],[P(i,3) P(i,4)],[P(i,2) P(i,2)],[P(i,3) P(i,4)],[P(i,2) P(i,1)],[P(i,4) P(i,4)]) text(C(i,1),C(i,2),[sprintf('%d',i)],'HorizontalAlignment','center'); drawnow end figure for i=1:10 hold on plot(C(i,1),C(i,2),[P(i,2) P(i,1)],[P(i,3) P(i,3)],[P(i,1) P(i,1)],[P(i,3) P(i,4)],[P(i,2) P(i,2)],[P(i,3) P(i,4)],[P(i,2) P(i,1)],[P(i,4) P(i,4)]) text(C(i,1),C(i,2),[sprintf('%d',i)],'HorizontalAlignment','center'); drawnow end figure for i=1:10 plot3([P(i,2) P(i,1)],[P(i,3) P(i,3)],[P(i,5) P(i,5)],[P(i,1) P(i,1)],[P(i,3) P(i,4)],[P(i,5) P(i,5)],[P(i,2) P(i,2)],[P(i,3) P(i,4)],[P(i,5) P(i,5)],[P(i,2) P(i,1)],[P(i,4) P(i,4)],[P(i,5) P(i,5)]) plot3([P(i,2) P(i,1)],[P(i,3) P(i,3)],[0 0],[P(i,1) P(i,1)],[P(i,3) P(i,4)],[0 0],[P(i,2) P(i,2)],[P(i,3) P(i,4)],[0 0],[P(i,2) P(i,1)],[P(i,4) P(i,4)],[0 0]) hold on plot3([P(i,2) P(i,2)],[P(i,4) P(i,4)],[P(i,5) 0],[P(i,1) P(i,1)],[P(i,4) P(i,4)],[P(i,5) 0],[P(i,2) P(i,2)],[P(i,3) P(i,3)],[P(i,5) 0],[P(i,1) P(i,1)],[P(i,3) P(i,3)],[P(i,5) 0]) xlabel('Eje X'); ylabel('Eje Y'); zlabel('Eje Z'); grid('on') [X Y]=meshgrid(P(i,2):P(i,1),P(i,4):P(i,3)) Z=0*X+Y*0+P(i,5)

Luisa VANEGAS ARISTIZÁBAL 5èmme année Génie Civil Master 2 SIG

31

surf(X,Y,Z) end inside=0; for i=1:m for j=1:n for k=0:o-1 for s=1:10 if(i<=P(s,1) && i>=P(s,2) && j>=P(s,4) && j<=P(s,3) && k<=P(s,5) && k>=0) inside=inside+1; plot3(i,j,k,'MarkerFaceColor',[1 0 0],'MarkerSize',3,'Marker','o','LineStyle','none','Color',[1 0 0]); title(sprintf('Projet CETHIL - Para %d puntos dentro',inside)) drawnow end end end end end execution_time=etime(clock, t0); disp(sprintf(' ____________________________________________________________________________________________')); disp(sprintf(' Finalisation Simulation : ')); disp(sprintf(' Temps d''exécution (s) = %g \r',execution_time)); disp(sprintf(' ____________________________________________________________________________________________'));

Luisa VANEGAS ARISTIZÁBAL 5èmme année Génie Civil Master 2 SIG

32

b. Script sous Python Ce script fait un maillage en 2D plus la création de 10 bâtiments. Il ne fait pas le test des points. import time def GenerateMesh(tamx, tamy): matrix = [[0 for i in range(tamx)] for j in range(tamy)] return matrix def FindEmptyArea(matrix, tamx, tamy, x1, y1, x2, y2): if x1 >= tamx or y1 >=tamy or x2 >= tamx or y2 >=tamy: return x1, x2, y1, y2 for i in range(tamx): for j in range(tamy): if x1<=i and i < x2: if y1<=j and j < y2: if matrix[i][j] == 1: if x1+1 < tamx and x2+1 < tamx: x1, x2, y1, y2 = FindEmptyArea(matrix, tamx, tamy, x1+1, y1, x2+1, y2) elif y1+1 < tamy and y2+1 < tamy: x1, x2, y1, y2 = FindEmptyArea(matrix, tamx, tamy, x1, y1+1, x2, y2+1) return x1, x2, y1, y2 def AddPolygon(matrix, tamx, tamy, x1, y1, x2, y2): x1, x2, y1, y2 = FindEmptyArea(matrix, tamx, tamy, x1, y1, x2, y2) for i in range(tamx): for j in range(tamy): if x1<=i and i < x2: if y1<=j and j < y2: matrix[i][j] = 1 return matrix def Routine(): v = GenerateMesh(100, 100) AddPolygon(v, 100, 100, 0, 0, 3, 3) AddPolygon(v, 100, 100, 0, 0, 3, 3) AddPolygon(v, 100, 100, 0, 0, 3, 3) AddPolygon(v, 100, 100, 0, 0, 3, 3) AddPolygon(v, 100, 100, 0, 0, 3, 3) AddPolygon(v, 100, 100, 0, 0, 3, 3) AddPolygon(v, 100, 100, 0, 0, 3, 3) AddPolygon(v, 100, 100, 0, 0, 3, 3) AddPolygon(v, 100, 100, 0, 0, 3, 3) AddPolygon(v, 100, 100, 0, 0, 3, 3) for i in range(100): print v[i]

Luisa VANEGAS ARISTIZÁBAL 5èmme année Génie Civil Master 2 SIG

33

start_time = time.clock() Routine() print time.clock() - start_time, "seconds"

c. Script sous C++ #include <iostream> using namespace std; void FindEmptyArea(int** matrix, int tamx, int tamy, int& x1, int& y1, int& x2, int& y2); void AddPolygon(int** matrix, int tamx, int tamy, int& x1, int& y1, int& x2, int& y2); int main(void) { int x, y; cout<<"porfavor digite el tamanio en x"<<endl; cin>>x; cout<<"porfavor digite el tamanio en y"<<endl; cin>>y; int** matrix; matrix = new int *[x]; for(int i=0; i < x; i++) { matrix[i] = new int[y]; } for(int i=0; i < x; i++) { for(int j=0; j < y; j++) { matrix[i][j] = 0; } } int x1 = 0, y1 = 0; int x2 = 3, y2 = 3; AddPolygon(matrix, 1000, 1000, x1, y1, x2, y2); /*AddPolygon(matrix, 1000, 1000, 0, 0, 3, 3); AddPolygon(matrix, 1000, 1000, 0, 0, 3, 3); AddPolygon(matrix, 1000, 1000, 0, 0, 3, 3); AddPolygon(matrix, 1000, 1000, 0, 0, 3, 3); AddPolygon(matrix, 1000, 1000, 0, 0, 3, 3); AddPolygon(matrix, 1000, 1000, 0, 0, 3, 3); AddPolygon(matrix, 1000, 1000, 0, 0, 3, 3); AddPolygon(matrix, 1000, 1000, 0, 0, 3, 3); AddPolygon(matrix, 1000, 1000, 0, 0, 3, 3);

Luisa VANEGAS ARISTIZÁBAL 5èmme année Génie Civil Master 2 SIG

34

*/ for(int i=0; i < x; i++) { for(int j=0; j < y; j++) { cout<<matrix[i][j]; } cout<<endl; } return 0; } void FindEmptyArea(int** matrix, int tamx, int tamy, int& x1, int& y1, int& x2, int& y2) { if(x1>=tamx || y1 >= tamy || x2 >= tamx || y2 >=tamy) { return; } for( int i = 0; i < tamx; i++) { for( int j = 0; j < tamy; j++) { if (x1<=i && i < x2) { if (y1<=j && j < y2) { if (matrix[i][j] == 1) { if (x1+1 < tamx && x2+1 < tamx) { x1++, x2++; FindEmptyArea(matrix, tamx, tamy, x1, y1, x2, y2); } else if( y1+1 < tamy && y2+1 < tamy ) { y1++, y2++; FindEmptyArea(matrix, tamx, tamy, x1, y1, x2, y2); } } } } } } } void AddPolygon(int** matrix, int tamx, int tamy, int& x1, int& y1, int& x2, int& y2) { FindEmptyArea(matrix, tamx, tamy, x1, y1, x2, y2); for( int i = 0; i < tamx; i++ ) { for (int j = 0; j < tamy; j++ )

Luisa VANEGAS ARISTIZÁBAL 5èmme année Génie Civil Master 2 SIG

35

{ if (x1<=i && i < x2) { if (y1<=j && j < y2) { matrix[i][j] = 1; } } } } }